建構函式初始化列表

2021-05-07 15:43:35 字數 1381 閱讀 9154

建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化式。例如:

example::example() : ival(0), dval(0.0) {}//ival

和dval

是類的兩個資料成員

上面的例子和下面不用初始化列表的建構函式看似沒什麼區別:

example::example()

的確,這兩個建構函式的結果是一樣的。但區別在於:上面的建構函式(使用初始化列表的建構函式)顯示的初始化類的成員;而沒使用初始化列表的建構函式是對類的成員賦值並沒有進行顯示的初始化

初始化和賦值對內建型別的成員沒有什麼大的區別,像上面的任乙個建構函式都可以。但有的時候必須用帶有初始化列表的建構函式

(1)成員型別是沒有預設建構函式的類。若沒有提供顯示初始化式,則編譯器隱式使用成員型別的預設建構函式,若類沒有預設建構函式,則編譯器嘗試使用預設建構函式將會失敗。

(2)const成員或引用型別的成員。因為

const

物件或引用型別只能初始化,不能對他們賦值。

另一篇:

effective c++學習筆記:初始化列表中成員列出的順序和它們在類中宣告的順序相同

請看下面的**:

template

class array ;

template

array::array(int lowbound, int highbound)

: size(highbound - lowbound + 1),

lbound(lowbound), hbound(highbound),

data(size)

{裡面有個嚴重的錯誤,絕對沒人會知道data裡會有多少個元素。你也許認為在data之前size已經被初始化了,實則不然,類成員變數的初始化不是按照初始化表的順序被初始化的,而是按照在類中宣告的順序被初始化的。

為什麼會這樣呢?我們知道,對乙個物件的所有成員來說,它們的析構函式被呼叫的順序總是和它們在建構函式裡被建立的順序相反。那麼,如果允許上面的情況(即,成員按它們在初始化列表上出現的順序被初始化)發生,編譯器就要為每乙個物件跟蹤其成員初始化的順序,以保證它們的析構函式以正確的順序被呼叫。這會帶來昂貴的開銷。所以,為了避免這一開銷,同一種型別的所有物件在建立(構造)和摧毀(析構)過程中對成員的處理順序都是相同的,而不管成員在初始化列表中的順序如何。

注意:上述內容不適用於static變數,static變數應該在類的建構函式前被初始化。

建構函式初始化列表

c 程式語言中有很多比較重要的概念值得我們去深入 比如今天為大家介紹的有關c 建構函式的相關概念。這一方面的知識在實際程式設計中就是乙個比較重要的應用技術。希望能個大家可以從中學到一些知識。c 建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化...

建構函式初始化列表

class object private int v1,v2 看看願意是 先初始化v2為5,然後初始化v1為 3 倍的 v2 但是結果卻是奇葩的,這個是因為建構函式的初始化列表遵循的原則是先初始化父類 父類也是這個原則,那麼就相當於遞迴 然後初始化本類的成員,最後執行建構函式的函式體 而初始化本類的...

建構函式初始化列表

今天我在想類裡面類型別是什麼時候初始化的 如 class a public b b classb 假如a a 定義乙個物件會為物件的資料成員分配空間,然後呼叫建構函式進行初始化 從概念上講建構函式的執行分為兩個階段初始化階段和計算階段,先初始化再計算 對於類裡面的所有類型別都是在初始化階段進行的初始...