武汉c培训
达内武汉中心

15271940953

热门课程

武汉C++培训:C++之双目/单目等运算符的重载

  • 时间:2016-04-13
  • 发布:武汉C++培训
  • 来源:c语言教程

武汉C++培训:C++之双目/单目等运算符的重载。1. 双目运算符重载

1.1格式:

L/*左操作数*/ # /*操作符*/ R/*右操作数*/

L#R

=> L.operator#(R) 成员形式,写在类中,成员函数形式

=> operator#(L,R) 非成员形式 //需要定义为类的友元函数

如:

cout 《 c1;

=> cout.operator《(c1)

=> operator《(cout,c1)

1.2实际操作形式:

类名 operator+(const 类名& 对象名)

{ return 类名(…,…);//构建的一个匿名对象}

类名 operator-(const 类名& 对象名)

{ return 类名(…,…);//构建的一个匿名对象}

类名& operator+=(const 类名& 对象名)

{ return *this = *this + 对象名;}

类名& operator-=(const 类名& 对象名)

{ return *this -= *this - 对象名;}

2. 单目运算符的重载

2.1格式:

#/*操作符*/O/*操作数*/

=>O.operator#();//成员形式

=>operator#(O); //非成员形式

如:

cout 《 -c1 《 endl;

c1.operator-();//成员函数形式

operator-(c1);//非成员函数形式

2.2实际操作形式:

类名 operator-(void)

{ return 类名(-…,-…);}

注意:

对于运算符重载的两种形式中,优先调用成员函数形式

3.关于自增自减运算符的使用:

(1) 前缀自增自减运算符

a.表达式的值是增减以后的值

b.运算函数返回的是操作数的引用

c.成员函数形式的运算符函数没有参数,友元函数形式的运算符函数只有一个参数:操作数

d.可以连用

class A

{ A& operator++(){  ++m_r;++m_i;return *this;}};//成员函数形式

A& operator(A& a)//友元函数形式

{

++m_r;++m_i;

return a;

}

注意:加引用就是为了连续使用;

(2) 后缀自增自减运算符

a.表达式的值是增减以前的值

b.运算函数返回的是操作数增减以前的副本

c.成员函数形式的运算符函数有int类型的哑元参数,友元函数形式的运算符函数有两个参数:操作数  和 哑元

d.不可以连用

class A

{ const A operator++(int){return(m_r++,m_i++);}};//成员函数形式

const A operator++(A& a,int)//友元函数形式

{ return A(a.m_r++,a.m_i++);}

注意:加const就是为了防止连续运算

4. 类型转换运算符函数

4.1格式:

在源类型中定义如下形式的运算符函数

operator 目标类型(void)

{

构造一个目标类型的对象返回(目标类型也可以是基本数据类型)

}

功能:

将一个类的对象转换成另一个类型的数据,该函数没有返回值类型;

注意:

如果在源类型中提供类型转换运算符函数的同时,在目标类型中定义支持类型转换的构造函数,对于隐式类型转换,系统会优先选择类型转换运算符函数 完成转换,而对于显式类型转换,系统优先选择构造函数(建议只提供构造函数即可,因为可以使用explicit 关键字修饰构造函数,表示该构造函数只能用于显示类型转换,从而防止潜在的错误;)

扩展:

如果一个类类型对象和一个基本数据类型运算时,怎么处理?

Complex c(2,3);

cout 《 "c + 100 " 《 c + 100 《 endl;//c.operator+(100);

5.不允许用户重载的运算符

::作用域解析操作符

. 成员访问操作符

.* 成员指针解引用

: 三目运算符

sizeof  字节长度运算符

typeid  类型信息操作符
注意:

(1)操作符的操作数中没有类类型的操作数时,不能重载

(2)不能通过运算符重载去发明新的操作符,比如:**

6.只能定义为成员函数的运算符

(1)下标操作符[] (见代码xibiao.cpp)//

//支持下标运算符的重载

int operator[](int n)

{ return m_data[n];}

(2)函数操作符() (见代码funOperator.cpp)//

class Square

{public://支持()运算符重载

int operator()(int n)

{return n*n;}};

(3)间接操作符*,->  (见代码 jianjie.cpp)//智能指针类

//智能指针类

class PA

{private:A* m_pa;

public:PA(A* pa):m_pa(pa){}

~PA(void)

{delete m_pa;m_pa = NULL;}

//支持->运算符函数

A* operator->(void)

{return m_pa;}

//支持*运算符重载

A& operator*(void)

{ return *m_pa;}};

7.new / delete 运算符的重载

应用:

一般把构造函数调用之前的初始化工作放在new运算符的重载函数中

一般把析构函数调用之后的善后工作放在delete运算符的重载函数中

例子://new []运算符进行重载

static void* operator new[](size_t size)

{void* p = malloc(size);cout 《 "我自己的New[]:size = " 《 size 《 ",p = " 《 p 《 endl;return p;}

// delete[] 运算符重载

static void operator delete[](void* p)

{cout 《 "我自己的delete[]:p = " 《 p 《 endl;free(p);}

上一篇:C++的那些事:类的拷贝控制
下一篇:武汉C++培训:strcpy函数导致release版程序崩溃

学C++之前要先学C语言吗?

武汉C++培训:简单的客户端和服务端程序

武汉C++培训:strcpy函数导致release版程序崩溃

武汉C++培训:C++之双目/单目等运算符的重载

选择城市和中心
贵州省

广西省

海南省