2008年(35)
分类: C/C++
2008-03-22 20:48:37
运算符重载
1. 运算符重载实际上就是一个函数,函数名是operator@,如果在类的成员函数里定义该函数那么该函数的调用就是 A.operator@ 否则是operator@
2. 运算符可以重载成成员函数,也可以重载成非成员函数(全局函数或友元函数), 重载为成员函数时,对于一元运算符来说不用参数,因为这个参数就是本身,对于二元运算符来说,只用一个参数,这个参数是当前表达式的右边参数。重载为非成员函数时,对于一元运算符来说用一个参数,这个参数就是要参加运算的参数,对于二元运算符来说,用二个参数,这二个参数是当前表达式中要参加运算的左参数和右参数。
3. 对于任何函数参数,如果仅需要读取而不改变,默认采用常量引用(const A& xx),如普通的+ - * / 布尔运算一般不会改变参数,所以用常量引用传递,特别是在非成员函数重载时,可以将参数全部写成常量引用( const A&)类型,而在用成员函数重载时,函数一般应该写成const成员函数,因为重载函数的左侧对象不能改变(如重载+ - * /时),在重载如”=””+=”等会改变左值的运算符时不加const。
4. 对于重载过程中的返回值,有常量返回(传递),引用返回(传递),常量引用返回(传递),如何决定采用哪种形式呢?如果该运算是产生一个新值,但是不改变左值,那就需要一个新的返回对象代表返回值,例如一般的operator+必须生成一个新的用于返回的临时对象,所以是作为一个常量传值方式返回,如果是在重载赋值语句等这类会改变左值的运算符时,因为左值已经被改变,返回值应该是这个左值所代表的已改变的非常量,因此要用非常量引用返回。
5. 当要将整个运算符语句作为左值时,如(b=c).func()时,就需要给这个临时的变量一个暂时性,即把赋值语句的返回作为左值使用时,应该是非常量引用返回。
6. 因为自增(++)和自减(--)有后缀版本和前缀版本,前缀版本修改参数,返回修改后的值,可以用引用返回,而后缀版本修改参数本身,但返回修改之前的值,所以应该创建一个代表以前值的对象返回,因此必须用传值的方式返回,前缀版本返回的值已经修改过,所以用非常量,后缀版本是运行过程中创建的新对象,它是临时变量,应该是常量。
7. 表达式作为函数参数时,因为他们都要借助于临时变量来给函数调用,所以对他们的返回值是常量或者是非常量对程序没有影响。
8.{return YY(x,y)(YY为对象)}与{YY mm(x,y),return mm;}
9.不常用的运算符,如, [] new delete也可以重载
10.operator->的重载用于迭代器的构造
11.operator->*的重载
12.不能重载的运算符 . ,*(指针),**
13.所有一元运算符建议使用成员函数重载,增加类的封装性,而对于{=,(),[],->,->*}必须是成员函数,对于
{+=,-=,*=,/=,……=,—=,|=,%=,>>=,<<=}
一般用成员函数,其他的建议重载成非成员函数
14.