c++在類的建構函式中,可以兩種方式初始化成員資料(data member)。
1,在建構函式的實現中,初始類的成員資料。諸如:
class point
int getx()
int gety()
};2,還可以定義初始化成員列表(initializer list)來初始化成員資料(data member)。
改寫建構函式如下:
point(int m=0,int n=0):x(m),y(n)
這樣咋一看沒有什麼不同,確實,對於上面的這種簡單列子來說,也真的沒有太大不同。
那我們為什麼要用初始化成員列表,什麼時候用初始化成員列表來初始化成員資料呢?lippman的《c++ primer》中提到在以下三種情況下需要使用初始化成員列表:
一,需要初始化的資料成員是物件的情況;
二,需要初始化const修飾的類成員;
三,需要初始化引用成員資料;
現在分別舉例說明:
一,需要初始化的資料成員是物件。
---------------------------
#include
class point
point(point& p)
int getx()
int gety()
};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就是防止被錯誤賦值的,引用型別必須定義賦值在一起)因此只能用初始化列表對齊進行初始化。
上面兩點比較好明白,可以用乙個例子加以說明:
-------------------------------------
#include
class base
base(int m, int n):a(m),b(n)
{}};
void main()
---------------------------
上面紅色的部分初始化的方式是不允許的通不過編譯,通過初始化列表則可以很好的定義。
C 中成員初始化列表的使用
c 在類的建構函式中,可以兩種方式初始化成員資料 data member 1,在建構函式的實現中,初始類的成員資料。諸如 class point int getx int gety 2,還可以定義初始化成員列表 initializer list 來初始化成員資料 data member 改寫建構函式...
C 中成員初始化列表的使用
c 在類的建構函式中,可以兩種方式初始化成員資料 data member 1,在建構函式的實現中,初始類的成員資料。諸如 class point int getx int gety 2,還可以定義初始化成員列表 initializer list 來初始化成員資料 data member 改寫建構函式...
C 成員初始化列表
類物件的構造順序是這樣的 1.分配記憶體,呼叫建構函式時,隱式 顯示的初始化各資料成員 初始化階段可以是顯式的或隱式的,取決於是否存在成員初始化表。隱式初始化階段按照宣告的順序依次呼叫所有基類的預設建構函式,然後是所有成員類物件的預設建構函式。2.進入建構函式後在建構函式中執行一般計算 計算階段由建...