【问题标题】:Class POD members default-initialization vs. zero-initialization vs. no-initialization?类 POD 成员默认初始化与零初始化与无初始化?
【发布时间】:2015-03-22 05:13:33
【问题描述】:

关于这个主题有很多问题,但其中许多使用了不准确的术语,而且答案大多是片面的。我将尝试以另一种方式提出问题,并希望对这个常见问题给出一个完美的答案。

  1. 对于 POD,默认初始化和零初始化之间有什么区别(如果有)?

  2. 如果一个成员POD变量没有在构造函数初始化列表中初始化,在这种情况下会是:

    • 零初始化。
    • 默认初始化(如果与上述不同)。
    • 未初始化。
  3. 上述问题 2 的答案是否取决于使用 new 运算符在堆栈上还是在堆上创建类的实例

  4. 对于 C++98、C++11 或 C++14,上述任何问题的答案是否不同?

【问题讨论】:

    标签: c++ c++11 c++14


    【解决方案1】:
    1. 在默认初始化中,基本的“C”风格类型(int、double、char、bool 等)具有不确定的值。也就是说,没有未定义的行为,但值可以是任何值。

    2. 如果 POD 成员未在构造函数中初始化,也未通过 C++11 类内初始化,则默认初始化。

    3. 无论栈还是堆,答案都是一样的。

    4. 在 C++98(而不是之后)中,new int() 被指定为执行零初始化。

    参考:http://en.cppreference.com/w/cpp/language/default_initialization

    【讨论】:

    • 那么在POD的情况下默认初始化是不初始化?
    • @mustafa:是的,根据我链接的页面“否则,什么都不做:具有自动存储持续时间的对象(及其子对象)被初始化为不确定的值。”
    猜你喜欢
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多