读书笔记 effective c++ Item 10 让赋值运算符返回指向*this的引用

news/2024/5/18 7:05:01

一个关于赋值的有趣的事情是你可以将它们链在一起:

1 int x, y, z;
2 
3 x = y = z = 15; // chain of assignments

同样有趣的是赋值采用右结合律,所以上面的赋值链被解析成下面这个样子:

1 x = (y = (z = 15));

在这里,15被赋值给z,然后赋值的结果(更新的z)被赋值给y,再然后赋值的结果(更新的Y)被赋值给x。

实现这个赋值链的方法是使赋值返回指向左边参数的引用,这也是你在为你的类实现赋值运算符的时候应该遵守的约定:

 1 class Widget {
 2 
 3 public:
 4 
 5 ...
 6 
 7 Widget& operator=(const Widget& rhs) // return type is a reference to
 8 
 9 { // the current class
10 
11 ...
12 
13 return *this; // return the left-hand object
14 
15 }
16 
17 ...
18 
19 };

这个约定除了适用于上面的标准形式之外,也适用于所有的赋值运算符,因此:

 1 class Widget {
 2 
 3 public:
 4 
 5 ...
 6 
 7 Widget& operator+=(const Widget& rhs) // the convention applies to
 8 
 9 { // +=, -=, *=, etc.
10 
11 ...
12 
13 return *this;
14 
15 }
16 
17 Widget& operator=(int rhs) // it applies even if the
18 
19 { // operator’s parameter type
20 
21 ... // is unconventional
22 
23 return *this;
24 
25 }
26 
27 ...
28 
29 };

这仅仅是一个约定,没有遵循这个约定的代码也能通过编译。然而,所有的内建类型和标准库(像string,vector,complex,tr1::shared_ptr等等)中的所有类型(或即将提供的类型,见Item54)都遵守这个约定。因此除非你有更好的理由,否则请遵守这个约定。


作者: HarlanC

博客地址: http://www.cnblogs.com/harlanc/
个人博客: http://www.harlancn.me/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接

如果觉的博主写的可以,收到您的赞会是很大的动力,如果您觉的不好,您可以投反对票,但麻烦您留言写下问题在哪里,这样才能共同进步。谢谢!


http://www.niftyadmin.cn/n/3568783.html

相关文章

IDEA 使用方法快捷键

CtrlShift Enter,语句完成“!”,否定完成,输入表达式时按 “!”键CtrlE,最近的文件CtrlShiftE,最近更改的文件ShiftClick,可以关闭文件Ctrl[ OR ],可以跑到大括号的开头…

微信小程序自定义数据分析试水

昨晚收到小程序自定义分析的内测邀请,简单试用了一下。说明挺长的,大概是这个意思: 一、定义一系列事件,对其进行统计 事件可以对页面中的这些事件进行追踪 click enterPage leavePage pageLoad pageUnload pullDownRefresh launc…

乡愁 余光中

小时候 乡愁是一枚小小的邮票 我在这头 母亲在那头 长大后 乡愁是一张窄窄的船票 我在这头 新娘在那头 后来啊 乡愁是一方矮矮的坟墓 我在外头 母亲在里头 而现在 乡愁是一湾浅浅的海峡 我在这头 大陆在那头

基于Jenkins+Git+Gradle实现自动打包部署

下载地址:https://jenkins.io/zh/download/ jenkins依赖Java,所以首先配置好java环境。建议下载 xxx.war,使用java -jar的方式来启动,其中java -jar可以写到脚本中,做到一键启动。 jenkins的默认配置和工作目录运行在~/.jenkins…

再别康桥 徐志摩

轻轻的我走了,正如我轻轻的来; 我轻轻的招手,作别西天的云彩。 那河畔的金柳,是夕阳中的新娘; 波光里的艳影,在我的心头荡漾。 软泥上的青荇,油油的在水底招摇; 在康河的柔波里…

服务端参数校验(一):校验工具

项目参见: https://gitee.com/xxssyyyyssxx/validation compile "top.jfunc.validation:validation-core:1.0.1" compile "top.jfunc.validation:validation-spring:1.0.1" all input is evil!! 服务端参数校验是保证…

服务端参数校验(二):SpringMVC项目的参数校验

项目参见: https://gitee.com/xxssyyyyssxx/validation compile "top.jfunc.validation:validation-core:1.0.1" compile "top.jfunc.validation:validation-spring:1.0.1" 上文提供了参数校验工具,但是如果我们把参数校验跟正常…

关于类初始化的一个诡异问题

圣思园张龙老师关于类加载器的一个例子。 这个打印的是1,1 这个打印的是1,0 造成以上的区别的原因就在于:类加载的时候先准备(静态变量赋默认值),然后初始化(赋值或者静态代码块),实例化。 类的…