C C 程式設計 成員初始化列表器列表

2021-10-22 12:06:48 字數 2939 閱讀 7826

struct foo

;// 初始化列表

};

#include

using

namespace std;

struct mem

mem(

int i)

:num

(i)int num =2;

// 就地初始化};

從上面可以看出,初始化列表總是後作用於就地初始化的。也就是說,初始化列表的效果總是優先於就地初始化的

建構函式的執行可以分為兩個階段,初始化階段和計算階段,初始化階段早於計算階段

所有類型別的成員都會在初始化階段初始化,即使該成員沒有出現在建構函式的初始化列表中

一般用於執行函式體內的賦值操作,下面的**定義兩個結構體,其中test1有建構函式,拷貝建構函式及賦值運算子,為的是方便檢視結果。test2是個測試類,它以test1的物件為成員,我們看一下test2的建構函式是怎麼樣執行的。

#include

using

namespace std;

struct test1

test1

(const test1& t1)

// 拷貝建構函式

test1&

operator=(

const test1& t1)

// 賦值運算子

int a ;};

struct test2};

struct test3

// 初始化列表呼叫的是拷貝建構函式};

解釋一下,第一行輸出結果對應呼叫**中第一行,構造乙個test1物件。第二行輸出對應test2建構函式中的**,用預設的建構函式初始化物件test1,這就是所謂的初始化階段。第三行輸出對應test1的賦值運算子,對test1執行賦值操作,這就是所謂的計算階段。

列表中的成員初始化器的初始化順序與出現順序無關,實際上,初始化的實際順序如下:

(注意:如果初始化的順序是由不同建構函式中的成員初始化器列表中的出現所控制,那麼析構函式就無法確保銷毀順序是構造順序的逆序了)

#include

#include

#include

struct base

;struct class :

public base

,// 初始化基類

x ( x )

,// x(成員)以 x(形參)初始化

y ,// y 初始化為 0

f// m 在 lg 前初始化,即使此齣它最後出現

// 空復合語句

class (

double a )

: y ( a+1)

, x ( y )

,// x 將在 y 前初始化,其值不確定

lg ( m )

// 基類初始化器未出現於列表中,它被預設初始化(這不同於使用 base(),那是值初始化)

class()

try// 函式 try 塊始於包含初始化器列表的函式體之前

:class

(0.0

)// 委託建構函式

catch(.

..)}

;int

main()

初始化類的成員有兩種方式:

使用初始化列表主要是基於效能問題。對於內建型別,如int、float等,使用初始化列表和在建構函式體內初始化差別不是很大,但是對於類型別來說,最好使用初始化列表,為什麼呢?由上面的測試可知,使用初始化列表少了一次呼叫預設建構函式的過程,這對於資料密集型的類來說,是非常高效的

所以乙個好的原則是,能使用初始化列表的時候盡量使用初始化列表。

除了效能問題之外,有些時場合初始化列表是不可或缺的,以下幾種情況時必須使用初始化列表

對於沒有預設建構函式的類,我們看乙個例子。

using

namespace std;

struct test1

int i ;};

struct test2

};

以上**無法通過編譯,因為test2的建構函式中test1 = t1這一行實際上分成兩步執行。

呼叫test1的預設建構函式來初始化test1

呼叫test1的賦值運算子給test1賦值

但是由於test1沒有預設的建構函式,所謂第一步無法執行,故而編譯錯誤。正確的**如下,使用初始化列表代替賦值操作。

struct test2

}

成員初始化列表

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

成員初始化列表

任乙個物件的建立都要呼叫建構函式,而在建構函式中一般要給物件屬性賦值。成員初始化列表 member initialize list 是建構函式中特有的語法,用以簡化對物件屬性的賦值。其用法如下 class myclass 以上 相當於 class myclass 用成員初始化列表的語法來表述很顯然 ...

成員初始化列表

從概念上講,可以認為建構函式分兩個階段執行 1 初始化階段 2 普通的計算階段。計算階段由建構函式函式體中的所有語句組成。不管成員是否在建構函式初始化列表中顯式初始化,類型別的資料成員總是在初始化階段初始化。初始化發生在計算階段開始之前。在建構函式初始化列表中沒有顯式提及的每個成員,使用與初始化變數...