C++ 構造函數詳解

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指針。

對於複製和賦值操作符可以看作一個單元,如果需要其中一個,我們幾乎也肯定需要另一個。

發佈了43 篇原創文章 · 獲贊 13 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章