Chinaunix首页 | 论坛 | 博客
  • 博客访问: 213130
  • 博文数量: 35
  • 博客积分: 1480
  • 博客等级: 上尉
  • 技术积分: 390
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-14 14:27
文章分类

全部博文(35)

文章存档

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也可以重载

10operator->的重载用于迭代器的构造

11operator->*的重载

12.不能重载的运算符 . ,*(指针),**

13.所有一元运算符建议使用成员函数重载,增加类的封装性,而对于{=,(),[],->,->*}必须是成员函数,对于

{+=-=*=/=,……=,—=|=%=>>=<<=}

一般用成员函数,其他的建议重载成非成员函数

14

阅读(1440) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~