1

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

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

4

3 回答 3

2

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

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

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

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

于 2013-10-24T11:04:03.813 回答
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

于 2013-10-24T11:03:47.730 回答
0

§12.6.2/7: mem-initializer 中的表达式列表或花括号初始化列表用于根据初始化规则初始化指定的子对象(或者,在委托构造函数的情况下,完整的类对象)直接初始化为8.5

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

例如:

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

类似于这样创建Bar对象:

Bar bar (...);
于 2013-10-24T11:09:02.293 回答