1,assignment动作可以串连在一起.
string w, x, y, z;
w = x = y = z = "Hello";
赋值使用右结合律,上述行动串被解析成这样:
w = (x = (y = (z = "Hello")));
或是:
w.operator=(x.operator=(y.operator=(z.operator=("Hello"))));
可见:y.operator=的引数就是前次调用operator=后的传回值.
2,常犯的错误:
(1)令opertor=传回void,它会妨碍assignment动作串链的形成.
(2)令opertor=传回一个const对象的引用.
如:const Widget& operator=(const Widget& rhs);
考虑下面的情况:
Widget w1, w2, w3;
(w1 = w2) = w3; //给const赋值
将导致段错误.
3,总结:你没有什么选择.
assignment总是传回一个reference,指向其左侧引数,即:*this.
string w, x, y, z;
w = x = y = z = "Hello";
赋值使用右结合律,上述行动串被解析成这样:
w = (x = (y = (z = "Hello")));
或是:
w.operator=(x.operator=(y.operator=(z.operator=("Hello"))));
可见:y.operator=的引数就是前次调用operator=后的传回值.
2,常犯的错误:
(1)令opertor=传回void,它会妨碍assignment动作串链的形成.
(2)令opertor=传回一个const对象的引用.
如:const Widget& operator=(const Widget& rhs);
考虑下面的情况:
Widget w1, w2, w3;
(w1 = w2) = w3; //给const赋值
将导致段错误.
3,总结:你没有什么选择.
assignment总是传回一个reference,指向其左侧引数,即:*this.