[010]令赋值操作符返回一个reference to *this

差不多最经典的就是这个了:

x = y = z = 15;
解读为:
x = (y = ( z = 15));

如果没有返回值,上述代码就不能通过编译。

其实看到标题就差不多明白这一条了,但是为什么连续赋值时最好让其返回一个reference to *this呢?

我们来举一个例子:

如果我们定义一个类R:

R r1(3, 4);
R r2;
R r3(4, 3);
cout << "r1 = " << r1 << ", r2 = " << r2 << ", r3 = " << r3 << endl;
(r3 = r2) = r1; //注意这里
cout << "r1 = " << r1 << ", r2 = " << r2 << ", r3 = " << r3 << endl;

其实从编译器角度来看,是不是reference都是OK的。

但在有注释的代码行处,是不是reference返回的结果是不同的。
如果是reference,那么r3的值会被r1覆盖;

如果不是reference,那么r3的复本被r1覆盖,但r3本身不会改变。
对于连等,一般还是觉得r3的值跟r1一样会比较正常,所以加上reference,当然如果你刻意不想让r3在连等中改变两次值,那就不要reference了。

时间: 2024-10-07 00:30:26

[010]令赋值操作符返回一个reference to *this的相关文章

Effective C++ 条款九、十 绝不在构造和析构过程中调用virtual函数|令operator=返回一个reference to *this

  1.当在一个子类当中调用构造函数,其父类构造函数肯定先被调用.如果此时父类构造函数中有一个virtual函数,子类当中也有,肯定执行父类当中的virtual函数,而此时子类当中的成员变量并未被初始化,所以无法调用子类与之对应的函数.即为指向虚函数表的指针vptr没被初始化又怎么去调用派生类的virtual函数呢?析构函数也相同,派生类先于基类被析构,又如何去找派生类相应的虚函数? 2.做法:将子类的某个函数改为non-virtual,然后在子类构造函数中传递参数给父类函数.然后父类的构造函数

Effective C++ Item 10 令operator= 返回一个reference to *this

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:令赋值(assignment)操作符返回一个reference to *this --> 这样可以实现级联赋值 示例: #include <iostream> #include <string> using namespace std; class Widget{ public: Widget(int v):value(v){} Widget& opera

Effective C++ Item10-令operator = 返回一个reference to *this

Item10-令operator = 返回一个reference to *this(Have assignment operators return a reference to *this) Ex: int x,y,z x=y=z=15;          //赋值连锁形式 赋值采用右结合律,所以上述连锁赋值被解析为:x=(y=(z=15)); 为了实现"连锁赋值",赋值操作符必须返回一个reference指向操作符的左侧实参,这是你为classes实现赋值操作符时应遵循的协议. E

赋值操作符返回真值问题-语法部分-《JavaScript_DOM编程艺术第二版》

2.4.1 22页 谈到了关于比较操作符的问题.作者的说法是:赋值操作符返回的都是[真] 但是注释下面提示: if(a=false){ alert('hello, world'); } 这段代码中的 alert('hello,world'); 是不会执行的. 其他情况可能得闲的时候去看看.

条款10:令operator=返回一个reference to *this

下面是示例:

C++中赋值操作符为什么要返回引用类型

class Test { Test& operator= (const Test& t) { } } 这个是我们熟悉的赋值操作符函数的格式,但是该函数为什么非得要返回一个引用呢. 查阅了很多资料感觉这种解释比较靠谱: Test a,b,c; a=b=c 这里存在连续赋值,这是符合C++的语法规范的.如果赋值操作符返回一个引用类型,倒不是说  b=c 返回的引用变量直接赋值给a,毕竟a不是引用类型. 该过程实际上是 b=c 返回一个引用temp,然后 a=temp 再次调用赋值操作符.这里存

C++我们必须要了解的事之具体做法(1)——构造、复制构造、析构、赋值操作符背后的故事

1. C++默认调用哪些函数 当类中的数据成员类型是trival数据类型(就是原c语言的struct类型)时,编译器默认不会创建ctor. copy ctor.assign operator.dctor. 只有在这些函数被调用时,编译器才会创建他们. 这时候我们要自己创建构造函数,初始化内置数据类型.一般我们不需要复制控制函数,当需要时编译器合成的就很好.一般编译器合成的复制控制函数只是简单的复制成员,若能满足要求就不需要自己写. 当类中含有引用.const成员时,必须在初始化列表中初始化成员.

C++复制控制:赋值操作符和析构函数

一.赋值操作符 类定义了该类型对象赋值时会发生什么.与拷贝构造函数一样,如果类没有定义自己的赋值操作符,编译器会合成一个. 1.重载操作符的简单介绍 重载操作符是一些函数,其名字为operator后跟着所定义的操作符的符号,通过定义名为operator=的函数,我们可以对赋值进行定义.操作符函数的形参表必须具有与该操作数数目相同的形参(如果操作符是一个成员,则包括隐式this形参).赋值是二元操作符,对应的两个形参,第一个形参为左操作数,第二个形参为右操作数. 注意: (1)当操作符为成员函数时

C++ Primer 学习笔记_54_类与数据抽象 --复制构造函数、赋值操作符

复制控制 --复制构造函数.赋值操作符 引言: 当定义一个新类型时,需要显式或隐式地指定复制.赋值和撤销该类型的对象时会发生什么– 复制构造函数.赋值操作符和析构函数的作用!      复制构造函数:具有单个形参,该形参(常用const修饰)是对该类类型的引用.当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式的使用复制构造函数:当将该类型的对象传递给函数或者从函数返回该类型的对象时,将隐式使用复制构造函数.     析构函数:作为构造函数的互补,当对象超出作用域或动态分配的对象被删除