天天看點

c++中構造函數初始化清單

http://blog.csdn.net/ianchoi/article/details/6917899

CSomeClass::CSomeClass()

//指派

{

x=0;

y=1;

}

//初始化清單

CSomeClass::CSomeClass() : x(0), y(1)

{

}

初始化清單方式使用原因:

1.第一、必要性;

設想你有一個類成員,它本身是一個類或者結構,而且隻有一個帶一個參數的構造函數。

class CMember {

public:

CMember(int x) { ... }

};

如果Cmember是另一個類的成員

class CMyClass {

CMember m_member;

public:

CMyClass();

};

//必須使用成員初始化清單

CMyClass::CMyClass() : m_member(2)

{

...

}

或是常量對象和引用

class student

{public :

student ()

.

.

.

protected:

const int a;

int &b;

}

student ::student(int i,int j):a(i),b(j){}

就是說在沒有預設構造函數的時候,如果一個類對象是另一個類的資料成員,那麼初始化這個數 據成員,就應該放到冒号後面。這樣可以帶參數。

第二個原因是出于效率考慮

假定你有一個類 CmyClass具有一個Cstring類型的成員m_str,你想把它初始化為 "yada yada. "。你有兩種選擇:

CMyClass::CMyClass() {

// 使用指派操作符

// CString::operator=(LPCTSTR);

m_str = _T( "yada yada ");

}

//使用類成員清單

// and constructor CString::CString(LPCTSTR)

CMyClass::CMyClass() : m_str(_T( "yada yada "))

{

}

編譯器總是確定所有成員對象在構造函數體執行之前初始化。第一個例子中調用了兩個Cstring函數(構造函數和指派操作符),而在第二個例子中隻調用了一個函數。内部類型如int或者long或者其它沒有構 造函數的類型下,在初始化清單和在構造函數體内指派這兩種方法沒有性能上的差别。不管用那一種方法,都隻會有一次指派發生。而在一些大的類裡面,你可能擁有一個構造函數和一個指派操作符都要調用同一個負 責配置設定大量記憶體空間的Init函數。

C++初始化類成員按照聲明的順序初始化的而不是按照出現在初始化清單中的順序。

繼續閱讀