想问一下 VS 里边 C++的初始化列表的问题

2019-03-17 16:19:34 +08:00
 SupperMary

代码如图:

请注意变量声明顺序和初始化列表的顺序。

在 Visual Studio 编译和运行都没有问题

在 g++ 使用 -Wall 参数时会显示下面的警告:

Visual Studio 我已经试过警告等级 4,并不会提示这个警告,若是启用全部警告,则会输出相当多的警告信息,全部指向 VS 自己的头文件。

我想问一下 Visual Studio 对初始化列表顺序和变量声明顺序不同的情况是不是不进行判断?若是可以进行判断的话,从哪里打开这个选项?

我确实没搜索到相关的信息。

2483 次点击
所在节点    C
2 条回复
justou
2019-03-17 17:12:17 +08:00
这个警告的意图是说明: 初始化顺序是按数据成员在类中的声明顺序来进行的, 不是按写在构造函数的初始化列表的顺序进行的.

这个其实并不是啥问题, 只要不在初始化列表中形成初始化的依赖, 比如说:
声明顺序为 n1, n2, 构造函数 A(): n2(2), n1(n2){} 是首先初始化 n1 的(用 n2 的值), 但是此时 n2 还没初始化, 所以最后 n1 的值是未定义的, n2 为 2

如果无法避免地有一些变量的初始化依赖另一些变量的初始化, 这些依赖其它的变量都放到构造函数的函数体中去初始化(良好习惯是尽量保持声明顺序与初始化顺序一致)

VS 的话, 找了下编译器文档
https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warnings-by-compiler-version?view=vs-2017#warnings-introduced-in-visual-c-2017-version-153-compiler-version-1911255060

C5038 data member 'member1' will be initialized after data member 'member2'

compiler version 19.11.25506.0 才引入的这个警告耶

提示: 开启全部警告后, 不要 include 任何标准库或其它头文件来测试编译, 不然一堆警告, 很难找到你想看的警告
SupperMary
2019-03-17 17:31:00 +08:00
@justou #1 会问这个是英文确实遇到了初始化列表中的变量依赖问题,问题中的代码是我单独写的,不过去掉头文件再编译这个方法很有意思,不过也挺蛋疼的,也不是特别严重的问题,根据 g++ 的警告信息已经修复了,感谢你的答案。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/545505

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX