Effective C++ 学习笔记(7)

Term10: Have assignment operators return a reference to *this.



要求=以及类似的+=、*=的返回值为当前对象的引用。

这句话是什么意思呢?


1. 为什么=需要返回值

首先,重载的操作符对于类的对象来说,其实质是它的成员函数。而对于形如a=b的表达式,用fun()来代替=操作符,则相当于a.fun(b),在这个fun()函数内利用对象b来修改a的成员就可以完成赋值操作了。可是为什么还需要返回值呢?看下面一个表达式:

a=b=c;

根据操作符的结合律,其实质为:

a=(b=c);

如果它们的操作符=返回为void,则b=c虽然可以使b被c赋值,但a=一个void型的对象,编译错误。 因此返回*this可以使得形如b=c的表达式不仅为b赋值,而且表达式本身也是同样类型的对象,可以继续参与运算。


2.为什么返回值需要是*this的引用呢?

前面说到,返回*this可以使赋值表达式本身变成当前类型的对象,从而可以作为一个整体继续参与运算。看下面一个表达式:

(a=b)=c;

我们知道,对于基本类型而言,这个表达式的结果就是a先用b赋值,再用c赋值,从而最终结果是a的值是c。然而如果我们重载的操作符,返回的是*this,由于函数返回值的特性,那么实际的表达式a=b所代表的对象,其实是a对象的一个拷贝,而非a对象本身。那么最终被c赋值的是拷贝了a对象的一个临时对象,而a的值依然是由b赋值的。

说到函数返回值的特性,我们回到1中的表达式,其中在为a赋值的时候,使用b=c的返回值。如果是直接返回*this,那么其实为a赋值的是b对象的一个拷贝;但如果返回的是*this的引用,则并不需要拷贝,而直接用b对象对a进行赋值。也就是说在这种连续赋值的场景下,使用引用还可以削减不必要的拷贝构造函数的调用,从而提高性能。


综上所述,赋值操作符以及其类似的操作符,请返回*this的引用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值