13.2 賦值操作符
與復制構造函數一樣,如果類沒有定義自己的賦值操作符,則編譯器會合成一個。
1. 介紹重載賦值
重載操作符是一些函數,其名字為operator後跟著所定義的操作符的符號。因此,通過定義名為operator=的函數,我們可以對賦值進行定義。
大多數操作符可以定義為成員函數或非成員函數。當操作符為成員函數時,它的第一個操作數隱式綁定到this指針。有些操作符(包括賦值操作符)必須是定義自己的類的成員。因為賦值必須是類的成員,所以this綁定到指向左操作數的指針。因此,賦值操作符接受單個形參,且形參是同一類類型的對象。右操作數一般作為const引用傳遞。
賦值操作符的返回類型應該與內置類型賦值運算返回的類型相同。內置類型的賦值運算返回對右操作數的引用,因此,賦值操作符也返回對同一類類型的引用。
class Class6
{
Class6 &operator=(const Class6 &c6);
};
2. 合成賦值操作符
合成賦值操作符(synthesized assignment operator)與合成復制構造函數的操作類似。它會執行逐個成員賦值(memberwise assignment):右操作數對象的每個成員賦值給左操作數對象的對應成員。除數組之外,每個成員用所屬類型的常規方式進行賦值。對於數組,給每個數組元素賦值。
合成賦值操作符根據成員類型使用適合的內置或類定義的賦值操作符,依次給每個成員賦值,該操作符返回*this,它是對左操作數對象的引用。
3. 復制和賦值常一起使用
類也可以定義自己的賦值操作符。一般而言,如果類需要復制構造函數,它也會需要賦值操作符。
實際上,應該將這兩個操作符看作一個單元。如果需要其中一個,我們幾乎也可以肯定需要另一個。
摘自 xufei96的專欄