c++ - 类 POD 成员默认初始化与零初始化与无初始化?

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

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

  1. 在 POD 的情况下,默认初始化和零初始化之间有什么区别(如果有)?

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

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

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

最佳答案

  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

关于c++ - 类 POD 成员默认初始化与零初始化与无初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28105256/

相关文章:

c++ - std::string 的解密有额外的填充字节?

c++ - 是否存在 int 成员保证零初始化的情况?

c++ - 在嵌套的 lambda 中捕获通用的可调用对象 - 总是向前?

c++ - 如何从移动捕获 lambda 表达式创建 std::function?

c++ - 僵尸进程和 fork

C++ Qt RegExp 不匹配 @ 或 | 等特殊字符或^

c++ - 如何解决 <<ClassName>> 的 "undefined reference to ` vtable 错误?

c++ - 异常处理和成员变量

c++ - Q_DECLARE_INTERFACE() 和 Q_PLUGIN_METADATA(),interface id string 需要匹配吗?

c++ - 二维数组如何存储在内存中?