什么时候C++ POD类型被零初始化?

Rod*_*ddy 15 c++ constructor initialization

来自C背景,我一直认为POD类型(例如整数)从未在C++中自动进行零初始化,但似乎这是完全错误的!

我的理解是,只有'裸'非静态POD值不会被填零,如代码片段所示.我做对了,还有其他重要的案例我错过了吗?

static int a;

struct Foo { int a;};

void test()
{
  int b;     
  Foo f;
  int *c = new(int); 
  std::vector<int> d(1);

  // At this point...
  // a is zero
  // f.a is zero
  // *c is zero
  // d[0] is zero
  // ... BUT ... b is undefined     
}  
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 17

假设您a在调用之前未进行过修改test(),a则其值为零,因为具有静态存储持续时间的对象在程序启动时为零初始化.

d[0]值为零,因为调用的构造函数std::vector<int> d(1)具有第二个参数,该参数采用默认参数; 第二个参数被复制到正在构造的向量的所有元素中.默认参数是T(),所以你的代码相当于:

std::vector<int> d(1, int());
Run Code Online (Sandbox Code Playgroud)

你是正确的,b具有不确定的价值.

f.a并且*c都具有不确定的值也是如此.要初始化它们(对于POD类型与零初始化相同),您可以使用:

Foo f = Foo();      // You could also use Foo f((Foo()))
int* c = new int(); // Note the parentheses
Run Code Online (Sandbox Code Playgroud)

  • @xtofl:如果POD类型对象没有初始化器(如`Foo f;`的情况),则该对象保持未初始化状态.`Foo f = Foo();`创建一个值初始化的`Foo`(这就是`Foo()`部分所做的),然后用它来初始化`f`. (2认同)