类 POD 成员默认初始化与零初始化与无初始化

Class POD members default-initialization vs. zero-initialization vs. no-initialization?

本文关键字:初始化 默认 POD 成员      更新时间:2023-10-16
关于

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

    对于
  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