C 建構函式初始化列表的好處

2021-05-02 07:34:27 字數 1095 閱讀 9388

c++ 類對像構造時,需要對類成員變數完成初始化賦值操作。使用初始化列表完成這步操作在效能上有益處。什麼好處呢?擺道理顯得不夠徹底。看書不如做實驗。讓我們結合執行過程來檢視。考慮如下示例**:

derive 類建構函式兩個 base 型別的引數,分別賦給該類兩個 base 型別的成員變數 b1、b2,乙個使用初始化列表,乙個使用等於號賦值。輸出結果如下:

前兩行輸出是主函式前兩行構造 b1、b2 對像時呼叫的帶參建構函式。第三行是初始化列表構造 b1 時呼叫的複製建構函式。第四行呼叫了一次預設建構函式……第四行是哪兒來的?

這裡需要陳述一下「複製建構函式」和「賦值過載函式」之間的語義區別。複製建構函式嘛,顧名思議,是根據乙個模子造乙個複製品出來。而賦值過載函式則是將乙個已存在的對像的資料導到另乙個已存在的對像中。因此,執行賦值動作之前,左值對像必須「已存在」。而在 derive 類構造完成之前,其成員 b2 是不存在的。類定義中的成員變數只是乙個宣告,並不實際存在。因此,在執行 this->b2 = base2 這句之前,程式必須先將 b2 使用預設建構函式生成,而後才可完成賦值動作。

通過單步除錯,走 dessembly,可以看到,在輸出複製建構函式資訊之後,derive 類的 b1 構造完成,b1.fck 值為 10,而在預設建構函式資訊輸出之後並執行 this->b2 = base2 語句之前,b2 構造完成,b2.fck 值為 0。由此證明上述過程。

其實這個問題很老套了,為何在此強調呢?為了引出後面的問題。

C 建構函式 ,初始化列表

c 中的類的建構函式 1.如果類中沒有定義建構函式,編譯器將生成乙個預設建構函式,這個預設建構函式會呼叫類中所有成員的預設建構函式,但不會對如int,double的基本資料型別做初始化 2.類中可以定義多個建構函式,但每個建構函式應該有不同的引數實現 3.預設建構函式必須定義的情況,當需要定義乙個物...

C 建構函式初始化列表

從概念上講,可以認為建構函式分兩個階段進行 1.初始化階段 2.普通的計算階段。計算階段由建構函式函式體中的所有語句組成 不管成員是否在建構函式初始化列表中顯示初始化,類型別的資料成員總是在初始化階段初始化。初始化發生在計算階段的開始之前。建議 使用建構函式初始化列表 注 必須對任何const或引用...

C 建構函式初始化列表

建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化式。例如 example example ival 0 dval 0.0 ival 和dval是類的兩個資料成員 上面的例子和下面不用初始化列表的建構函式看似沒什麼區別 example exam...