问题描述
- 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尚未被初始化,结果未定吧
时间: 2024-10-03 02:53:20