条款10:令operator= 返回一个reference to *this
Have assignment operators return a reference to *this.
连锁赋值
首先,关于赋值,可以将它们写成连锁的形式:
int x, y, z;
x = y = z = 15; //赋值的连锁形式
其次,因为赋值所采用的是右结合律,因此,上面的连锁赋值可以解析为:
x = (y = (z = 15));
在这里,15首先被赋值给z,然后将结果(更新之后的z)再被赋值给y,然后其结果(更新之后的y)再被赋值给x。
为了实现这样的“连锁赋值”,
- 赋值操作符必须返回一个reference,指向操作符的左侧的实参
这也是为classes实现赋值操作符是应该遵守的协议:
class Widget {
public:
...
Widget& operator=(const Widget& rhs) //返回类型是一个reference,指向当前的对象
{
...
return* this; //返回左侧的对象
}
...
};
这个协议不仅使用于以上的标准赋值形式,也适用于所有赋值相关运算。例如:
class Widget {
public:
...
Widget& operator+=(const Widget& rhs) //这个协议也适用于+=,-=,*=等
{
...
return* this;
}
Widget& operator=(int rhs) //此函数也同样使用
{
...
return *this;
}
...
};
需要注意的是,这只是一个协议,并不是强制的。但是,最好还是这样做,因为这份协议被所有的内置类型和标准程序库提供的类型如string,vector,complex,tr1::shared_ptr或即将提供的类型所共同遵守的。
最后: