天天看点

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++初始化类成员按照声明的顺序初始化的而不是按照出现在初始化列表中的顺序。

继续阅读