為什麼使用初始化列表會快一些?

2021-10-20 10:48:12 字數 2301 閱讀 9131

檢視下面兩段**:

// (1)

class

classa

;class

classb

private

: classa ma;

};

// (2)

class

classa

;class

classb

private

: classa ma;

};

為什麼2的效率要高?

初始化列表的效率要高。

首先把資料成員按型別分類

內建資料型別,復合型別(指標,引用)

使用者定義型別(類型別)

分情況說明:

初始化列表,顧名思義,是對成員資料進行初始化,而不是賦值,賦值操作在建構函式體內!

好比:

classa a;

classa b = a;

classa a;

classa b;

b = a;

的區別。

上述的**1不夠清晰,我們寫成下面這樣:

#include

using

namespace std;

class

classa

classa

(const classa& a)

~classa()

classa&

operator=(

const classa& a)};

class

classb

private

: classa ma;};

intmain()

// 列印如下:

//1 classa()

//2 copy classa()

//3 copy classa()

//4 ~classa()

//5 ~classa()

//6 ~classa()

classa a;呼叫預設建構函式構造a物件

classb(classa a) : ma(a) {}, classb類的建構函式裡的classa a形參拷貝1宣告的物件

classb(classa a) : ma(a) {}, 初始化列表拷貝2裡的形參a的物件

2裡的形參a析構

1裡的a析構

物件b裡的ma析構

4,5,6的析構順序沒有驗證。

對於**2

#include

using

namespace std;

class

classa

classa

(const classa& a)

~classa()

classa&

operator=(

const classa& a)};

class

classb

private

: classa ma;};

intmain()

// 列印如下:

//1 classa()

//2 copy classa()

//3 classa()

//4 operator=

//5 ~classa()

//6 ~classa()

//7 ~classa()

classa a;呼叫預設建構函式構造a物件

classb(classa a) : ma(a) {}, classb類的建構函式裡的classa a形參拷貝1宣告的物件

初始化列表進行初始化,呼叫預設建構函式

operator=, 函式體內賦值操作,把2裡的a賦值給ma

2裡的形參a析構

1裡的a析構

物件b裡的ma析構

**2相對於**1,少了一次預設的建構函式。 **1直接呼叫拷貝構造,**2先呼叫預設構造,再呼叫賦值函式。

所有初始化列表要快一點!

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

將建構函式分為兩個階段的執行過程 初始化階段和建構函式函式體階段。既然稱它為成員初始化列表,那麼該階段在初始化階段完成。那麼類成員變數不外乎類型別和非類型別。而對於非類型別而言,此時 無論是在初始化表中還是函式體內完成賦值效果是一致的,即並未初始化。表現的有點不同的是類型別 test1 includ...

C 初始化列表的一些問題

在我們建立類物件的時候,類物件的構造順序如下 使用初始化列表的情況有三種 需要初始化的資料成員是物件的情況 需要初始化const修飾的類成員以引用型別的成員資料 子類需要初始化父類的私有成員 輸出結果 如果沒有mytest test 1,2,3 初始化列表就會報錯 因為test有了顯示的帶引數的建構...

為什麼子類的初始化列表不能初始化父類的成員

class rectangle rectangle int x,int y a x b y public int a int b class square public rectangle error c2614 square 非法的成員初始化 a 不是基或成員.square int x 子類 來來...