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

Effective C++ 條款 10:讓 operator= 回傳 *this 參考

     編輯:關於C++

條款內容

實作指派運算子(operator=)時,應回傳一個指向 *this 的參考,以支援鏈式指派(chained assignment)。

為什麼需要鏈式指派?

C++ 內建型別支援如下寫法:

int x, y, z;
x = y = z = 15; // 等價於 x = (y = (z = 15))

這要求 operator= 的回傳值可作為左值(lvalue)參與下一次指派。若回傳 void 或 by value,鏈式指派將無法編譯或行為錯誤。

標準實作範例

class Widget {
public:
    Widget& operator=(const Widget& rhs) {
        // 1. 檢查自我指派
        if (this == &rhs) return *this;
        // 2. 釋放舊資源、複製新資源...
        // 3. 回傳 *this 參考
        return *this;
    }
};

關鍵要點

  1. 回傳型別必須是 Widget&(非 const Widget&,否則 (a = b) = c 會失敗)。
  2. 回傳 *this,代表目前物件的左值參考。
  3. 處理自我指派(if (this == &rhs) return *this;),避免釋放自身資源後再複製導致錯誤。
  4. 這是 C++ 標準慣例,雖非強制,但違反會破壞使用者預期與標準庫演算法需求(如 std::sort 等要求可指派型別)。

常見錯誤

// 錯誤 1:回傳 void
void operator=(const Widget& rhs) { ... }

// 錯誤 2:回傳 by value(切割問題、效能差、無法鏈式)
Widget operator=(const Widget& rhs) { ... }

// 錯誤 3:回傳 const Widget&(無法 (a=b)=c)
const Widget& operator=(const Widget& rhs) { ... }

總結

「令 operator= 回傳 *this 參考」是 C++ 類別設計的基石規範之一,確保物件語意與內建型別一致,支援標準演算法與直觀的鏈式指派語法。

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