分配運算子

賦值運算子是最重要的運算子之一,因為它允許你更改變數的狀態。

如果沒有為 class / struct 過載分配運算子,它將由編譯器自動生成:自動生成的賦值運算子執行成員賦值,即通過在所有成員上呼叫賦值運算子,以便複製一個物件另一方,一個成員。當簡單的成員賦值不適合你的 class / struct 時,賦值運算子應該被過載,例如,如果你需要執行物件的深層複製

過載賦值運算子 = 很簡單,但你應該遵循一些簡單的步驟。

  1. **測試自我分配。**此檢查很重要,原因有兩個:
    • 自我分配是一種不必要的副本,因此執行它是沒有意義的;
    • 在自我分配的情況下,下一步將不起作用。
  2. **清理舊資料。**舊資料必須替換為新資料。現在,你可以理解上一步的第二個原因:如果物件的內容被破壞,則自我分配將無法執行復制。
  3. **複製所有成員。**如果你為 classstruct 過載了分配運算子,它不會由編譯器自動生成,因此你需要負責從其他物件複製所有成員。
  4. 返回 *this。運算子通過引用自行返回,因為它允許連結(即 int b = (a = 6) + 4; //b == 10)。
//T is some type
T& operator=(const T& other)
{
    //Do something (like copying values)
    return *this;
}

注意: otherconst& 傳遞,因為被分配的物件不應該被更改,並且通過引用傳遞比按值更快,並且為了確保 operator= 不會意外地修改它,它是 const

賦值運算子只能class / struct 中過載,因為 = 的左值始終class / struct 本身。將其定義為自由函式沒有這種保證,因此不允許這樣做。

當你在 class / struct 中宣告它時,左邊的值隱含了 class / struct 本身,所以沒有問題。