關於賦值有許多有趣的事情,其中之一就是:你可以把賦值操作連在一起: <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
int x, y, z;
x = y = z = 15; // 一連串的賦值
令一件有趣的事是:這一賦值工作是自右結合的,所以上面的賦值鏈可以解析成這樣:
x = (y = (z = 15));
在這裏, 15 首 先賦 值給 z ,然後這次賦值的結果(就是更新過的 z 的值)將賦給 y ,然後這次賦值的結果(就是更新過的 y 的值)又賦給 x 。
這種實現方法的本質是:賦值時,返回一個指向運算符左手邊參數的引用,當你爲你的類實現賦值運算符時,你應該遵循這一慣例:
public:
...
Widget& operator=(const Widget& rhs) // 返回值類型是一個引用,
{ // 該引用指向當前類
...
return *this; // 返回至運算符左邊的對象
}
...
};
這一慣例對於所有的賦值運算符同樣適用,不僅僅是上述的標準形式。於是,我們要這樣書寫:
public:
...
Widget& operator+=(const Widget& rhs) // 這一慣例對於 += 、 -= 、 *=
{ // 等運算符均使用
...
return *this;
}
Widget& operator=(int rhs) // 即使某些時刻運算符的參數不合常規,
{ // 這一慣例仍需要得到貫徹
...
return *this;
}
...
};
這僅僅是一個慣例,不遵循這一慣例的代碼也能夠得到編譯。然而,所有的內建數據類型,以及標準庫中所包括(或者即將包括的,可以參見第 54 條)的所有類型(比如說, string 、 vector 、 complex 、 tr1::shared_ptr ,等等)都遵守這一慣例。當你要做一些有悖於該慣例的事情時先要考慮一下,是否有充分的理由這樣做?否則請遵循慣例。
需要記住的
l 讓賦值運算符返回一個指 向 *this 的引 用。