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的引用。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通;、 3本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看ReAdmE.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值