【问题标题】:What will cause the data members in class initialized to zeros?什么会导致类中的数据成员初始化为零?
【发布时间】:2020-02-25 10:44:39
【问题描述】:

默认构造函数不应将任何数据成员清零。但在某些情况下,似乎不是这样的。

代码示例很简短。

#include <iostream>

using namespace std;

class Foo {
public:
  int val;
  Foo() = default;
};

int main() {
  Foo bar;
  if (bar.val != 0) {
    cout << "true" << endl;
  } else {
    cout << "false" << endl;
  }
  return 0;
}

除此之外,上述程序输出:

true

但是,如果添加了 bar 数据成员的打印语句,var 成员将被初始化为零:

...
int main() {
  Foo bar;
  cout << bar.val << endl;
  ...
}

输出将是:

0
false

同样,如果在类Foo中添加虚函数和析构函数:

#include <iostream>

using namespace std;

class Foo {
public:
  virtual void Print() {}
  ~Foo() {}
  int val;
  Foo() = default;
};

int main() {
  Foo bar;
  if (bar.val != 0) {
    cout << "true" << endl;
  } else {
    cout << "false" << endl;
  }
  return 0;
}

或者只是初始化 bar 对象:

class Foo {
public:
  int val;
  Foo() = default;
};

int main() {
  Foo bar = Foo();
  ...
}

输出:

false

那么影响类的数据成员值的原因是什么?不应该所有这些测试都使用true 输出吗?

【问题讨论】:

  • 这能回答你的问题吗? What is the default value for C++ class members
  • static storage duration 上的部分解释了一些您可以指望零的情况。
  • 请注意,读取未初始化的变量是未定义的行为,会导致整个程序没有明确定义的含义。当包含 UB 时,允许编译器对程序的 any 部分执行 anything。你再也无法推理了。
  • 这种情况可能没有原因...

标签: c++ c++11 initialization


【解决方案1】:

在这种情况下作为default initialization

否则,什么都不做:具有自动存储持续时间的对象(及其子对象)被初始化为不确定的值。

请注意,不确定值包括0,这也是一个有效的结果。顺便说一句,读取这些不确定的值会导致 UB。

【讨论】:

  • 如果该答案还指出后续读取未确定值causes UB in C++,则该答案将更有价值。
  • 但是为什么在某些特定情况下使用0 初始化呢?有什么原因吗?
  • @yeah 关于未定义行为的推理毫无意义。
猜你喜欢
  • 2013-10-14
  • 2021-12-16
  • 2016-05-09
  • 2019-11-24
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
相关资源
最近更新 更多