那我們為什麼要用初始化成員列表,什麼時候用初始化成員列表來初始化成員資料呢?lippman的《c++ primer》中提到在以下三種情況下需要使用初始化成員列表:
一,需要初始化的資料成員是物件的情況;
二,需要初始化const修飾的類成員;
三,需要初始化引用成員資料;
現在分別舉例說明:
一,需要初始化的資料成員是物件。
---------------------------
[cpp]view plain
copy
#include
class
point
point(point& p)
intgetx()
intgety()
};
class
point3d
point3d(int
i,int
j, int
k):m_p(i,j)
// 相當於 point m_p(i,j)這樣對m_p初始化
void
print()
};
---------------------------------------
上述**中point3d是乙個3d座標,他有乙個point的2d座標和乙個成員組成。
我們現在想定義乙個3d座標p3d,可以這樣實現:
void main()
從point3d實現體可以看出,我們是通過對m_p進行賦值,這樣不僅呼叫copy constructor產生臨時物件而且是對m_p的乙個賦值操作。
而如果使用成員初始化列表,我們則可以這樣:
void main()
p3d中的point型成員是通過呼叫初始化的方式構建的。由於物件賦值比初始化要麻煩的多,因此也帶來的效能上的消耗。(可以參見scott meyers著《effective c++》條款12)。
這也是我們在對成員資料是物件成員的採用初始化列表進行初始始化的主要原因。
二,需要初始化const修飾的類成員;
三,需要初始化引用成員資料;
對於類成員是const修飾,或是引用型別的情況,是不允許賦值操作的,(顯然嘛,const就是防止被錯誤賦值的,引用型別必須定義賦值在一起)因此只能用初始化列表對齊進行初始化。
上面兩點比較好明白,可以用乙個例子加以說明:
-------------------------------------
[cpp]view plain
copy
#include
class
base
base(int
m, int
n):a(m),b(n)
{}
};
void
main()
C 成員初始化列表
類物件的構造順序是這樣的 1.分配記憶體,呼叫建構函式時,隱式 顯示的初始化各資料成員 初始化階段可以是顯式的或隱式的,取決於是否存在成員初始化表。隱式初始化階段按照宣告的順序依次呼叫所有基類的預設建構函式,然後是所有成員類物件的預設建構函式。2.進入建構函式後在建構函式中執行一般計算 計算階段由建...
C 成員初始化列表
c 初始化類的成員,不僅可以用constructor完成,也可以用初始化類成員列表來完成。有些情況只能用第一種,而且通常第一種效率高些。兩者區別 1,普通變數編譯器會預設替你初始化。它們既能初始化,也能被賦值,而常量const按照其意思只能被初始化,不能賦值。所有const member只能用成員初...
C 成員初始化列表
首先明確,成員初始化列表只能用於建構函式 class a 怎麼編寫建構函式來初始化成員變數a呢?可能會想到這樣 a a 其實這是乙個賦值過程,在執賦值之前,初始化已經完成了,const變數是不可以被賦值的,只能在初始化的時候給乙個值 所以這裡用到成員初始化列表,成員初始化列表指出了怎樣初始化 a a...