什么会导致类中的数据成员初始化为零?

yea*_*eah 1 c++ initialization c++11

默认构造函数不应将任何数据成员归零。但是在某些情况下,似乎并非如此。

代码示例很简短。

#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;
}
Run Code Online (Sandbox Code Playgroud)

作为例外,以上程序输出:

true
Run Code Online (Sandbox Code Playgroud)

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

...
int main() {
  Foo bar;
  cout << bar.val << endl;
  ...
}
Run Code Online (Sandbox Code Playgroud)

输出将是:

0
false
Run Code Online (Sandbox Code Playgroud)

同样,如果向类添加虚函数和析构函数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;
}
Run Code Online (Sandbox Code Playgroud)

或只是初始化栏对象:

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

int main() {
  Foo bar = Foo();
  ...
}
Run Code Online (Sandbox Code Playgroud)

输出:

false
Run Code Online (Sandbox Code Playgroud)

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

son*_*yao 5

在这种情况下,作为默认初始化

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

请注意,不确定值包括0,这也是有效的结果。BTW读取这些不确定的值会导致UB。