如果成员对象data
在构造函数的初始化列表中出现不,则data
由其默认构造函数构造。
如果构造函数的初始化列表中出现data
,那么它只是初始化到给定值。这是否意味着没有构造函数调用来创建data
?那么新对象data
是如何构建的呢?
答案 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 (...);