代码如图:
请注意变量声明顺序和初始化列表的顺序。
在 Visual Studio 编译和运行都没有问题
在 g++ 使用 -Wall
参数时会显示下面的警告:
Visual Studio 我已经试过警告等级 4
,并不会提示这个警告,若是启用全部警告,则会输出相当多的警告信息,全部指向 VS 自己的头文件。
我想问一下 Visual Studio 对初始化列表顺序和变量声明顺序不同的情况是不是不进行判断?若是可以进行判断的话,从哪里打开这个选项?
我确实没搜索到相关的信息。
1
justou 2019-03-17 17:12:17 +08:00 2
这个警告的意图是说明: 初始化顺序是按数据成员在类中的声明顺序来进行的, 不是按写在构造函数的初始化列表的顺序进行的.
这个其实并不是啥问题, 只要不在初始化列表中形成初始化的依赖, 比如说: 声明顺序为 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 任何标准库或其它头文件来测试编译, 不然一堆警告, 很难找到你想看的警告 |
2
SupperMary OP @justou #1 会问这个是英文确实遇到了初始化列表中的变量依赖问题,问题中的代码是我单独写的,不过去掉头文件再编译这个方法很有意思,不过也挺蛋疼的,也不是特别严重的问题,根据 g++ 的警告信息已经修复了,感谢你的答案。
|