C 類建構函式初始化列表及初始化成員變數的誤區

2021-08-19 17:46:17 字數 1141 閱讀 3546

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

[cpp] 

view plain

copy

class

cexample   

//建構函式內部賦值

cexample()  

};  

上面的例子中兩個建構函式的結果是一樣的。上面的建構函式(使用初始化列表的建構函式)顯式的初始化類的成員;

而沒使用初始化列表的建構函式是對類的成員賦值,並沒有進行顯式的初始化。

初始化和賦值對內建型別的成員沒有什麼大的區別,像上面的任乙個建構函式都可以。對非內建型別成員變數,為了避免兩次構造,推薦使用類建構函式初始化列表。

但有的時候必須用帶有初始化列表的建構函式:

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

2.const成員或引用型別的成員。因為const物件或引用型別只能初始化,不能對他們賦值。 或者改為static。

【常量必須在建構函式的初始化列表裡面初始化 或 設定成static】

例子:

class a

class a}或者

class a

初始化列表的成員初始化順序:

c++初始化類成員時,是按照宣告的順序初始化的,而不是按照出現在初始化列表中的順序。跟初始化列表的順序無關

example:

[cpp] 

view plain

copy

class

cmyclass 

;  cmyclass::cmyclass(int

x, int

y) : m_y(1), m_x(m_y)  

你可能以為上面的**將會首先做m_y=1,然後做m_x=m_y,最後它們有相同的值。

但是編譯器先初始化m_x,然後是m_y,,因為它們是按這樣的順序宣告的。結果是m_x將有乙個不可**的值。

有兩種方法避免它,乙個是總是按照你希望它們被初始化的順序宣告成員,第二個是,如果你決定使用初始化列表,總是按照它們宣告的順序羅列這些成員。這將有助於消除混淆。

C 類建構函式初始化列表和初始化順序

建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化式。例如 class cexample 建構函式內部賦值 cexample 上面的例子中兩個建構函式的結果是一樣的。上面的建構函式 使用初始化列表的建構函式 顯式的初始化類的成員 而沒使用初始化...

建構函式初始化列表和初始化函式

其實並沒有所謂的初始化函式的概念,本文中的初始化函式只是說明在函式體內進行賦值。而初始化列表才是真正意義上的物件初始化。使用初始化列表效率會高一點。c 規定,物件的成員變數的初始化動作發生在進入建構函式本體之前。在建構函式體內只是賦值,並不是初始化。請看下面這個栗子 class base publi...

c 子類建構函式初始化及父類構造初始化

我們知道,構造方法是用來初始化類物件的。如果在類中沒有顯式地宣告建構函式,那麼編譯器會自動建立乙個預設的建構函式 並且這個預設的建構函式僅僅在沒有顯式地宣告建構函式的情況下才會被建立建立。1.父類沒有宣告建構函式 1 子類也沒有宣告自己的建構函式,則父類和子類均由編譯器生成預設的建構函式。2 子類中...