V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
SupperMary
V2EX  ›  C

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

  •  
  •   SupperMary · 2019-03-17 16:19:34 +08:00 · 2621 次点击
    这是一个创建于 2077 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码如图:

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

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

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

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

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

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

    2 条回复    2019-03-17 17:31:00 +08:00
    justou
        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 任何标准库或其它头文件来测试编译, 不然一堆警告, 很难找到你想看的警告
    SupperMary
        2
    SupperMary  
    OP
       2019-03-17 17:31:00 +08:00
    @justou #1 会问这个是英文确实遇到了初始化列表中的变量依赖问题,问题中的代码是我单独写的,不过去掉头文件再编译这个方法很有意思,不过也挺蛋疼的,也不是特别严重的问题,根据 g++ 的警告信息已经修复了,感谢你的答案。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2820 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:00 · PVG 12:00 · LAX 20:00 · JFK 23:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.