分配運算子
賦值運算子是最重要的運算子之一,因為它允許你更改變數的狀態。
如果沒有為 class
/ struct
過載分配運算子,它將由編譯器自動生成:自動生成的賦值運算子執行成員賦值,即通過在所有成員上呼叫賦值運算子,以便複製一個物件另一方,一個成員。當簡單的成員賦值不適合你的 class
/ struct
時,賦值運算子應該被過載,例如,如果你需要執行物件的深層複製。
過載賦值運算子 =
很簡單,但你應該遵循一些簡單的步驟。
- **測試自我分配。**此檢查很重要,原因有兩個:
- 自我分配是一種不必要的副本,因此執行它是沒有意義的;
- 在自我分配的情況下,下一步將不起作用。
- **清理舊資料。**舊資料必須替換為新資料。現在,你可以理解上一步的第二個原因:如果物件的內容被破壞,則自我分配將無法執行復制。
- **複製所有成員。**如果你為
class
或struct
過載了分配運算子,它不會由編譯器自動生成,因此你需要負責從其他物件複製所有成員。 - 返回
*this
。運算子通過引用自行返回,因為它允許連結(即int b = (a = 6) + 4; //b == 10
)。
//T is some type
T& operator=(const T& other)
{
//Do something (like copying values)
return *this;
}
注意: other
由 const&
傳遞,因為被分配的物件不應該被更改,並且通過引用傳遞比按值更快,並且為了確保 operator=
不會意外地修改它,它是 const
。
賦值運算子只能在 class
/ struct
中過載,因為 =
的左值始終是 class
/ struct
本身。將其定義為自由函式沒有這種保證,因此不允許這樣做。
當你在 class
/ struct
中宣告它時,左邊的值隱含了 class
/ struct
本身,所以沒有問題。