构造函数中成员启动列表的计算顺序

Order of evaluation of member initiazation-list in a constructor

本文关键字:计算 顺序 列表 启动 成员 构造函数      更新时间:2023-10-16

构造函数成员初始化列表顺序取决于类中成员变量声明的顺序

这是我在网上读到的。

以下代码的这种输出背后的原因是什么:

#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 %dn",obj.a,obj.b,obj.c);
    printf("%d %d %dn",obj2.a,obj2.b,obj2.c);
}

我期待:

1 2 3
* 1 2

但输出是:

0 1 2
0 1 2

工作示例:http://ideone.com/cw0qLQ

原因是您对这两种情况都使用了第二个构造函数定义

A(int y,int z) : b(y),c(z) {
}

构造函数调用

A obj(1,2.3);
      // ^

具有一个double参数,该参数将自动转换为2。 在这两种情况下,a都未初始化。

在这两种情况下,您都调用构造函数

A(int y,int z)

obj 的情况下,您可能会无意中这样做,但最终结果是代码在这两种情况下都不会初始化A::a

当您访问obj.aobj2.a时,您会调用未定义的行为。你不能期望你的程序有任何特定的结果。

我可以看到在您的代码中调用了 ctor 函数 A (int,int),它只是初始化 y 和 z 并保留默认值 x。