考虑一下:
class Foo {
private:
Bar x;
public:
Foo(int a) { // no initialization here since constructor is dependent on a following if-block
if (a==0) x=Bar(12,'a', 34); // some (int, char, int) constructor of Bar
else x=Bar(13); // (int) constructor of Bar
}
}
这应该做的是检查参数 a 的值,并根据 a 的值使用特定构造函数和特定参数初始化 Bar x。然而,问题是,这当然会被编译器读取为
Foo(int a): Bar() { // !
if (a==0) x=Bar(12,'a', 34); // some Bar(int, char, int) constructor of Bar
else x=Bar(13); // Bar(int) constructor of Bar
}
编译器将 Bar() 添加到初始化列表中,因为我省略了它。它现在被双重初始化,一次使用它的 () 构造函数,一次在函数体中。但是,如果初始化 Bar(即使使用其默认构造函数)成本非常高(关于性能)并且我不能或不想进行这种双重初始化怎么办?
我怎么能不初始化 Bar x,直到在实际的构造函数体中?如果这不可能,我将如何最好地解决这个问题?
补充一点:为什么 C++ 是这样设计的?为什么它强制在实际构造函数主体之前初始化成员?
我认为你问错了问题,而不是试图禁止初始化,你应该这样做,即将你的 ctor 拼写为:
Foo(int a) : x((a==0) ? Bar(12,'a', 34) : Bar(13)) {}
这不会导致任何复制或移动(请参阅 here ),并且它是惯用的。
我是一名优秀的程序员,十分优秀!