C++ 构造函数中成员初始化列表的求值顺序
构造函数成员初始化列表顺序取决于类中成员变量声明的顺序 这是我在网上看到的 以下代码输出背后的原因是什么:C++ 构造函数中成员初始化列表的求值顺序,c++,constructor,C++,Constructor,构造函数成员初始化列表顺序取决于类中成员变量声明的顺序 这是我在网上看到的 以下代码输出背后的原因是什么: #include<cstdio> class A { public: int a,b,c; A(int x,int y,int z) : a(x),b(y),c(z) { } A(int y,int z) : b(y),c(z) { } }; int main() { A obj(1,2.3); A o
#include<cstdio>
class A
{
public:
int a,b,c;
A(int x,int y,int z) : a(x),b(y),c(z)
{
}
A(int y,int z) : b(y),c(z)
{
}
};
int main()
{
A obj(1,2.3);
A obj2(1,2);
printf("%d %d %d\n",obj.a,obj.b,obj.c);
printf("%d %d %d\n",obj2.a,obj2.b,obj2.c);
}
但结果是:
0 1 2
0 1 2
工作示例:
我可以看到,在您的代码中调用了ctor函数A(int,int),它只是初始化y和z,并将x保留为默认值。原因是您在这两种情况下都使用了第二个构造函数定义
A(int y,int z) : b(y),c(z) {
}
构造函数调用
A obj(1,2.3);
// ^
具有一个
double
参数,该参数将自动转换为2
<在这两种情况下,代码>都保持未初始化状态。在这两种情况下,您都调用构造函数
A(int y,int z)
在obj
的情况下,您可能会无意中这样做,但最终结果是,在这两种情况下,代码都不会初始化A::A
当您访问
obj.a
或obj2.a
时,您将调用未定义的行为。你不能期望从你的程序中得到任何特别的结果。obj(1,2.3)代码>嗯。那个小数应该在那里吗??您两次调用两个参数构造函数,对吗?a
在两个对象中都没有初始化。你不应该期待任何特别的事情。访问a
会给出未定义的行为。不确定这与操作顺序有什么关系……在双参数构造函数中初始化B和C,并将一个双参数十进制数传递到obj
。所以如果你做得对并且有一个obj(1,2,3);A obj(1,2)代码>我希望123\n*12)
你希望有一个星号?这很有趣……ideone上突出显示的语法以紫色显示2.3
,因此如果它确实是一个打字错误,它应该会突出显示出来。不,a
在第二种情况下不是值初始化的,它只是没有初始化,大多数时候它恰好是0
很好地捕捉到了一个typo@vsoftcoTHX用于指出,已修复。“大多数情况下,它恰好是0”,在gcc上,我经常看到彩虹放屁的独角兽:)@JBarberU我没有对事件为真的集合的度量做出精确而严格的数学陈述。但是,如果你在大多数编译器上尝试,你会得到零(尽管它也是UB,所以你不应该期望为零)。至少在我的机器和大多数在线编译器上都是这样。我想我看到的独角兽比你多:)只是没有默认值。
A(int y,int z)