构造函数中成员启动列表的计算顺序
Order of evaluation of member initiazation-list in a 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 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.a
或obj2.a
时,您会调用未定义的行为。你不能期望你的程序有任何特定的结果。
我可以看到在您的代码中调用了 ctor 函数 A (int,int),它只是初始化 y 和 z 并保留默认值 x。
相关文章:
- 计算 I+V[i++] 的顺序是什么?
- 委派的 ctor 是否受参数计算顺序的影响?
- 函数参数计算顺序与 Lambda 捕获评估顺序
- 构造函数中初始化列表的计算顺序是否固定?
- 大括号和括号之间的参数计算顺序
- C++:cout 和函数调用之间的计算顺序
- 操作员 * 的计算顺序
- C++:计算顺序运算符时忽略括号
- C ,以下代码的计算顺序
- 使用参数和此关键字时的计算顺序
- 为什么在 c++ 中未指定函数参数的计算顺序
- 构造函数中成员启动列表的计算顺序
- C++嵌套的条件运算符计算顺序
- 赋值子表达式的计算顺序
- 初始化中的计算顺序
- 宏计算顺序
- C语言中等优先级操作数的计算顺序
- 移动语义和参数计算顺序
- 运算符优先级和计算顺序
- C++ 参数计算顺序