Effective-c++-第十三项的疑问
问题描述:
Effective C++中,条款13:是这样写的:初始化列表中成员列出的顺序和他们在类中声明的顺序相同。
而且给出了相关例子。比如如果在类中是这样声明的:
class A{
...
private:
int sum1;
int sum2;
}
在构造函数中这样写
A::A:sum2(sum1),sum1(10){...}
这样写就会有问题,sum2的值是错误的。
但是如果这样写
A::A:sum2(10),sum1(10)
这样就不会有问题。这是为什么?在函数实现中同样是先对sum2进行了初始化,另个结果却不相同
答
取决于依赖,因为没法保证sum1在sum2前初始化,这样就会导致undefined behavior
答
应该是sum2(sum1)时,sum1尚未被初始化,结果未定吧
答
- 这个应该是pascal/cdecl的问题.也就是参数是从左到右进栈还是从右到左进栈的问题。
- 微软默认好像都是cdecl的.你试试反过来写 ```
A::A:sum1(10),sum2(sum1){...}
答
变量按照定义的顺序初始化,所以反过来就可能不正确。至于怎么不正确,不同的编译器不同,属于未定义行为。
答
没有错
答
按照顺序初始化,当执行 sum2(sum1) 在 sum1(10)之前,
初始化sum2时,sum1未被初始化,所以不行吧
答
应该是sum2(sum1)时,sum1尚未被初始化,结果未定吧