Effective-c++-第十三项的疑问

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尚未被初始化,结果未定吧