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)。
這也是我們在對成員資料是物件成員的採用初始化列表進行初始始化的主要原因。
C 建構函式初始化成員列表
1.只能在建構函式初始化列表初始化的成員變數的型別?a.const成員變數 b.引用型別的成員變數 c.static不能在初始化列表中進行初始化 d.類成員變數中有自定義型別的變數最好在初始化列表中進行初始化 2.初始化列表的順序?初始化列表的初始化順序是依據類成員變數定義的順序來決定的。3.關於s...
c 初始化成員列表 C 成員物件和封閉類
成員物件與封閉類 類裡有其他物件則該物件叫 成員物件 有成員物件的類叫 封閉類 上例中,如果 ccar 類不定義建構函式,則會使用預設的無參建構函式,那麼下面的語句會編譯出錯 ccar car 因為編譯器不明白 ccar 類中的 tyre 成員物件該如何初始化。而 engine 成員物件的初始化則沒...
從彙編看c 初始化列表初始化成員變數
簡略來說,編譯器會對初始化列表按照成員變數的宣告順序重新一一排序,安插到建構函式中進行初始化操作,而且這些初始化操作在建構函式裡面使用者自己定義的任何 之前。下面是c 原始碼 class x intmain 下面是main函式裡面的彙編碼 13 int main xoreax,eax movesp,...