首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

為什麼 operator= 應回傳參考?C++ 賦值運算子的設計考量

     編輯:關於C++

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)。
  • 回傳非 const 參考,允許賦值表達式本身被修改或綁定至非 const 參考:
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)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved