MSDN 文件指出:operator= 預設回傳參考——TYPE& TYPE::operator=(const TYPE&)。為什麼不是 void?雖然你可以寫 void operator=(const TYPE&) 並完成賦值,但這會失去鏈式賦值能力。
C++ 賦值運算子為右結合。表達式 a = b = c = d 會被解析為 a = (b = (c = d))。若 operator= 回傳 void,c = d 的結果無法作為 b = ... 的右運算元,鏈式賦值即失效。
為了讓鏈式賦值運作,operator= 必須回傳左運算元物件的參考(即 *this)。這也是為什麼標準實作最後一行總是 return *this;:
CMyClass& CMyClass::operator=(const CMyClass& rhs) {
// ... 執行賦值邏輯 ...
return *this;
}
rhs 宣告為 const 參考,允許常數物件賦值(a = const_obj)。void MyFunc(TYPE& a);
TYPE a, b;
MyFunc(a = b); // 賦值後傳遞參考
(a = b) = c; // 甚至可透過括號改變結合順序
class FOO {
int val;
public:
FOO(int v=0):val(v){}
FOO& operator=(const FOO& rhs) { val = rhs.val; return *this; }
int get() const { return val; }
};
int main() {
FOO a(1), b(2), c(3);
a = b = c; // 鏈式賦值
cout << a.get(); // 輸出 3
(a = b) = c; // 強制左結合
cout << a.get(); // 輸出 3(因為 (a=b) 回傳 a 的參考,再賦值 c)
}
想深入掌握賦值操作、複製建構、移動語意等細節,強烈推薦 Scott Meyers 經典巨著《Effective C++》(Addison-Wesley, 1997)。