C 成員初始化列表

2021-09-18 04:49:13 字數 1987 閱讀 2943

首先明確,成員初始化列表只能用於建構函式

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修飾的類成員 三,需要初始化引用成員資料 現在分別舉例說明 一,需要初始化的資料...