何时在构造函数的初始化列表中初始化时构造成员对象?

时间:2013-10-24 11:00:25

标签: c++ initializer-list default-constructor

如果成员对象data在构造函数的初始化列表中出现,则data由其默认构造函数构造。

如果构造函数的初始化列表中出现data ,那么它只是初始化到给定值。这是否意味着没有构造函数调用来创建data?那么新对象data是如何构建的呢?

3 个答案:

答案 0 :(得分:2)

  

如果数据出现在构造函数的初始化列表中,那么它只是初始化为给定值。

不,它是使用提供的任何参数初始化的。如果它具有类类型,则将参数传递给合适的构造函数。

  

这是否意味着没有构造函数调用来创建数据?

没有。如果它有类类型,那么通过调用构造函数来完成初始化。

答案 1 :(得分:0)

当您在构造函数的初始化列表中初始化data时,将调用其参数化构造函数。
例如:

#include <iostream>
#include <string>

class Data {
public:
    Data(int firstArg, std::string mSecondArg)
    {
        std::cout<<"parameterized constructor called"<<std::endl;
    }
};

class SomeClass {
public:
    SomeClass(int firstArg, std::string secondArg) : data(firstArg, secondArg) {}
private:
    Data data;
};

int main(int argc, char** argv) {
    SomeClass someObj = new SomeClass(0, new std::string("empty"));
    return 0;
}

使用此代码,您将获得输出
parameterized constructor called

答案 2 :(得分:0)

  

§12.6.2/ 7: mem-initializer中的expression-list或braced-init-list用于初始化指定的子对象(或者,如果是委托构造函数,完整的类对象)根据 8.5 的初始化规则进行直接初始化。

换句话说,这意味着调用普通构造函数。

例如:

class Foo { Bar bar; Foo () : bar(...) { } };

与创建Bar对象类似:

Bar bar (...);