C 為什麼需要成員初始化列表

2021-06-13 03:14:00 字數 1476 閱讀 8338

將建構函式分為兩個階段的執行過程:初始化階段和建構函式函式體階段。

既然稱它為成員初始化列表,那麼該階段在初始化階段完成。

那麼類成員變數不外乎類型別和非類型別。而對於非類型別而言,此時

無論是在初始化表中還是函式體內完成賦值效果是一致的,即並未初始化。

表現的有點不同的是類型別:

test1:

#includeusing namespace std;

class b

{public:

b(){ cout<

b類的預設建構函式被呼叫來初始化 b 物件了,也就是說對於類型別物件將呼叫它的預設建構函式完成初始化。

如果在成員初始化列表中顯示地用b類接收int 形參的建構函式會怎麼樣:

b成員的物件直接呼叫了帶int形參的建構函式,利用成員初始化列表我們完成了類成員的初始化工作。

那如果將他放入函式體中呢:

可以看見,它同樣可以達到想要的結果,可是此時我們期望的是利用帶引數的建構函式初始化b類物件,並不期望多此一舉的

先呼叫預設構造。而之所以這樣就是因為我們並未將初始化在函式體之前完成,而是將它帶入了函式體。

所以,對於類型別物件的成員變數初始化過程:

1 編譯器發現有類物件的定義時,首先找到了成員初始化列表,如果未找到相應的初始化定義,

則呼叫類的預設建構函式來完成初始化。找到則採用列表中的定義。

2 如果使用者希望採取非預設構造初始化物件,而有將其放在函式體中,則此時一定要為該類提供預設的

建構函式,否則編譯報錯。

3 可以看出,如果你顯示定義了帶參構造,那麼總是為類提供乙個預設的建構函式是好的習慣,可以幫你避免許多可能麻煩。

4 對於某些必須在定義的同時初始化的變數,成員初始化列表就是非用不可的了,如const或則是引用型別,否則編譯報錯。

5 注意上面所說的是類型別成員物件的表現,而非引用或指標的表現。

特殊的成員:static成員它是在什麼時候初始化的呢?答案是在第一次用到該成員時,因為static成員在記憶體中只有乙份的拷貝,

它在整個程式階段只被初始化一次。可以往a中加入static變數定義,發現例項化a物件後static變數未被初始化。

總之。如何利用好成員的初始化列表還是很重要的。

C 成員初始化列表

類物件的構造順序是這樣的 1.分配記憶體,呼叫建構函式時,隱式 顯示的初始化各資料成員 初始化階段可以是顯式的或隱式的,取決於是否存在成員初始化表。隱式初始化階段按照宣告的順序依次呼叫所有基類的預設建構函式,然後是所有成員類物件的預設建構函式。2.進入建構函式後在建構函式中執行一般計算 計算階段由建...

C 成員初始化列表

c 初始化類的成員,不僅可以用constructor完成,也可以用初始化類成員列表來完成。有些情況只能用第一種,而且通常第一種效率高些。兩者區別 1,普通變數編譯器會預設替你初始化。它們既能初始化,也能被賦值,而常量const按照其意思只能被初始化,不能賦值。所有const member只能用成員初...

c 成員初始化列表

那我們為什麼要用初始化成員列表,什麼時候用初始化成員列表來初始化成員資料呢?lippman的 c primer 中提到在以下三種情況下需要使用初始化成員列表 一,需要初始化的資料成員是物件的情況 二,需要初始化const修飾的類成員 三,需要初始化引用成員資料 現在分別舉例說明 一,需要初始化的資料...