爱技术 & 爱分享
爱蛋蛋 & 爱生活

Member Initialization List

当你写出一个constructor的时候,就有机会设定 class member的初始值。要不是经过 member initialization list 就是在constructor 函数体内部。

本文主要是来讨论一下何时使用initialization 更优…

这里列举一下必须使用 member initialization list 的情景:

  1. 当初始化一个reference member的时候
  2. 当初始化一个 const member的时候(C++11之前)
  3. 当调用一个base class的constructor,而它拥有一组参数时
  4. 当调用一个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 之前 就已经被初始化完成了。

赞(0) 传送门
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。墨影 » Member Initialization List