当你写出一个constructor的时候,就有机会设定 class member的初始值。要不是经过 member initialization list 就是在constructor 函数体内部。
本文主要是来讨论一下何时使用initialization 更优…
这里列举一下必须使用 member initialization list 的情景:
- 当初始化一个reference member的时候
- 当初始化一个 const member的时候(C++11之前)
- 当调用一个base class的constructor,而它拥有一组参数时
- 当调用一个member class 的constructor,而它拥有一组参数时
我们来看一下这段程序:
class Word
{
String _name;
int _cnt;
public:
Word()
{
_name=0;
_cnt=0;
}
};
在这里,Word Constructor会先产生一个临时的 string object ,然后将它初始化,之后以赋值运算符将临时性的object 指定给 _name,然后再销毁临时的object。所以在编译器内部可能是这么做的:
Word:Word(/*this 指针被传入*/)
{
调用string的default constructor
_name.string::string();
string temp=string(0);
_name.string::operatoe=(temp);
temp.string::~string();
_cnt=0;
}
如果我们这么写:
Word::Word():_name(0)
{
_cnt=0;
}
编译器可能会这么做:
Word::Word(/*this 指针被传入*/)
{
//调用constructor
_name.string::string(0);
_cnt=0;
}
initialization list的初始化class member的操作在任何 explicit user code 之前被调用(意思是,initialization list 初始化class member 会在任何位于constructor体中定义的代码之前完成)。并且,初始化顺序是以member在class中的声明顺序来决定的,而不是在initialization list 中的顺序(这一点一定要注意,特别是一个member的初始化依赖于另外一个member的时候)。
编译器会改写initialization list的顺序,以便符合class member的声明顺序。
那么还有一点就是,在initialization list中调用 member function是否被允许呢?
答案是允许的,不过是否安全还得依赖于你的member function中所使用的其他class member 是否已经初始化完成。
为什么可以完成调用呢?
是因为this指针在开始使用initialization list初始化 member 之前 就已经被初始化完成了。