c 建構函式的初始化列表

2022-09-29 15:54:21 字數 1092 閱讀 9885

首先,執行下圖中的c++**,輸出是什麼?

複製** **如下:

class a

void print() };

int main(void)

答案:輸出n1是乙個隨機的數字,n2為0。在c++中,成員變數的初始化順序與變數在型別中的宣告順序相同,而與它們程式設計客棧在建構函式的初始化列表中的順序無關。因此在這道題中,會首先初始化n1,而初始n1的引數n2還沒有初始化,是乙個隨機值,因此n1就是乙個隨機值。初始化n2時,根據引數0對其初始化,故n2=0。

建構函式的初始化列表僅僅指定用於初始化成員的值,並不指定這些初始化執行的次序。成員初始化的次序就是定義成員的次序,第乙個成員首先被初始化,然後是第二個,依次類推。也就是說,c++編譯器很容易得到建構函式的引數列表,獲取引數,然後根據成員變數的宣告順序初始化成員變數(這是因為,後宣告的變數有可能依賴先宣告的成員變數,因此要有先宣告先初始化,後宣告的後初始化)。

大家可能看到這裡就會覺得,好麻煩啊,當類中的乙個資料成員是根據其他資料成員而初始化的時候,初始化列表的次序不能跟成員變數的宣告次序不一致,否則會出現不可預料的錯誤。

的確是這樣的,所以有人就會想到,我乾脆把初始化列表的那些操作都放到建構函式的函式體內對資料成員進行賦值操作就行了,的確這樣做是程式設計客棧可以的,但是有時建構函式的初始化列表是必須的。

有些資料成員必須在建構函式初始化列表中進行初始化。對於這樣的成員,在建構函式體內對它們賦值是不起作用的。沒有預設建構函式的類型別的成員,以及const型別的成員變數和引用型別的成員變數,不管是哪種型別,都必須在建構函式初始化列表中進行初始化。

例如,下面的建構函式定義就是錯誤的:

複製** **如下:

class a

};記住,可以初始化 const 物件或引用型別的物件,但不能對它們賦值。在開始執行建構函式的函式體之前,要完成初始化,初始化 const 或引用型別的資料成員的唯一機會就是在建構函式的初始化列表中。

例如,下面的建構函式定義就是正確的:

複製** **如下:

class a

a() : j(0) , k(i) };

int main(void)

本文標題: c++ 建構函式的初始化列表

本文位址:

C 建構函式 ,初始化列表

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

C 建構函式初始化列表

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

C 建構函式初始化列表

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