1.有時候需要構造函數初始化列表
有些成員必須在構造函數初始化列表中初始化,對於這樣的成員,在構造函數函數體沒法對它們進行賦值,包括:任何const成員,引用類型成員以及沒有默認構造函數的類類型成員。如下count必須在初始化列表中初始化,而不能在構造函數函數體中進行賦值,而name可以在初始化列表中初始化,也可以在函數體中初始化:
class Item{
public:
Item(const string& strName="test"):count(10){name="hello";};
string name;
const int count;
};
注意:成員的初始化順序就是定義成員的順序。
2.默認構造函數
只有當一個類沒有定義構造函數時,編譯器纔會自動生成一個默認構造函數,通常我們需要定義一個默認的構造函數。
3.複製構造函數
只有單個形參,而且該形參是對本類類型對象的引用(常用const修飾),這樣的構造函數稱爲複製構造函數。當定義一個新對象並用一個同類型的對象對它進行初始化時,將顯式使用複製構造函數。當將該類型對象傳遞給函數或從函數返回該類型對象時,將隱式使用複雜構造函數。
當用於類類型對象時,初始化的複製形式和直接形式有所不同:直接初始化直接調用與實參匹配的構造函數,複製初始化總是調用複製構造函數。複製初始化首先使用指定構造函數創建一個臨時對象,然後用複製構造函數將那個臨時對象複製到正在創建的對象。
如果我們沒有定義複製構造函數,編譯器會爲我們合成一個。合成複製構造函數的行爲是,執行逐個成員初始化,將新對象初始化爲原對象的副本。一般只包含類類型成員或內置類型(但不是指針類型)成員的類,無須顯式地定義複製構造函數,也可以複製。
如果類想要禁止複製,則類必須顯式聲明其複製構造函數爲private,如果想要連友元和成員中的複製也禁止,就可以聲明一個private複製構造函數而不對它進行定義。如果定義了複製構造函數,也必須定義默認構造函數。
4.賦值操作符
通過定義名爲operator=的函數,我們可以對賦值進行定義。當操作符爲成員函數時,它的第一個操作數隱式綁定到this指針。
對於複製和賦值操作符可以看作一個單元,如果需要其中一個,我們幾乎也肯定需要另一個。