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)