首先明確,成員初始化列表只能用於建構函式
class a;
怎麼編寫建構函式來初始化成員變數a呢?
可能會想到這樣
a::a()
其實這是乙個賦值過程,在執賦值之前,初始化已經完成了,const變數是不可以被賦值的,只能在初始化的時候給乙個值
所以這裡用到成員初始化列表,成員初始化列表指出了怎樣初始化
a::a() : a(value){}
class a
與非靜態const成員一樣,左引用繫結乙個左值只能在初始化階段完成,所以這裡用到成員初始化列表,成員初始化列表指出了怎樣初始化
a::a() : a(left_value){}
基類:
class classbase
派生類:
class classderived:public classbase
public繼承會繼承基類的私有成員,但是只能由基類的介面訪問,所以對於派生類的建構函式,不能簡單的使用賦值進行初始化基類成員
因此,在執行派生類建構函式之前,要先執行基類的建構函式
同樣,可以使用成員初始化列表,表示基類怎樣初始化,也就是說,顯式的告訴編譯器呼叫哪乙個建構函式初始化基類成員
呼叫基類的有參構造
classderived::classderived(int x):classbase(x)
呼叫基類的無參構造
classderived::classderived() : classbase()
classderived::classderived()
成員初始化列表不表示構造函式呼叫過程,表示了呼叫哪乙個,如果不加成員初始化列表,則表示基類呼叫預設建構函式(無參的建構函式)
class a ;
a::a()
a::a(int a)
const a &a::operator=(const a &obj)
class b ;
可以怎樣初始化b的物件中的obja1和obja2呢?
第一種,賦值
b::b()
int main()
輸出:
a()
a()
a() << 生成臨時物件呼叫無參構造
a::operator=(const a &) << obja1.operator=(上面的臨時物件)
a(int) << 生成臨時物件呼叫有參構造
a::operator=(const a &) << obja2.operator=(上面的臨時物件)
通過分分析,可以發現,在執行函式體之前,已經呼叫過兩次預設的建構函式,可以使用成員初始化列表,在初始化階段(建構函式體執行之前)表示呼叫哪乙個建構函式
b::b() : obja1(), obja2(3){}
輸出:
a()
a(int)
如果呼叫預設的無參構造,可以省略
比較發現,使用成員初始化列表的效率會比賦值高得多
對於基本型別來說,初始化和賦值沒什麼區別。
對於類物件:初始化列表表示了呼叫哪乙個建構函式,不寫初始化列表表示呼叫預設。
C 成員初始化列表
類物件的構造順序是這樣的 1.分配記憶體,呼叫建構函式時,隱式 顯示的初始化各資料成員 初始化階段可以是顯式的或隱式的,取決於是否存在成員初始化表。隱式初始化階段按照宣告的順序依次呼叫所有基類的預設建構函式,然後是所有成員類物件的預設建構函式。2.進入建構函式後在建構函式中執行一般計算 計算階段由建...
C 成員初始化列表
c 初始化類的成員,不僅可以用constructor完成,也可以用初始化類成員列表來完成。有些情況只能用第一種,而且通常第一種效率高些。兩者區別 1,普通變數編譯器會預設替你初始化。它們既能初始化,也能被賦值,而常量const按照其意思只能被初始化,不能賦值。所有const member只能用成員初...
c 成員初始化列表
那我們為什麼要用初始化成員列表,什麼時候用初始化成員列表來初始化成員資料呢?lippman的 c primer 中提到在以下三種情況下需要使用初始化成員列表 一,需要初始化的資料成員是物件的情況 二,需要初始化const修飾的類成員 三,需要初始化引用成員資料 現在分別舉例說明 一,需要初始化的資料...