檢視下面兩段**:
// (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 子類 來來...