3

我有一个带有几个双精度值的结构:

struct A {
  double a;
  double b;
}

如果我创建一个新结构,例如A a,所有成员(例如a.a)是否在 C++ 中自动初始化为零?

4

3 回答 3

11

默认情况下不是(除非它是静态存储的变量 - 即一个static或全局变量)。

有几种方法可以将这种结构初始化为“零”:

A a = { 0.0, 0.0 };
A a = { };

A a = A();

或者如果你有一个 C++11 兼容的编译器:

A a{0.0, 0.0};
A a{}

或在定义中添加构造函数struct

struct A {
  double a;
  double b;
  A() : a(0.0), b(0.0) {}
};
于 2013-06-14T10:30:04.910 回答
7

8.5。初始化程序 [dcl.init] / 11

如果没有为对象指定初始化器,则该对象是默认初始化的;如果不执行初始化,则具有自动或动态存储持续时间的对象具有不确定的值。[注意:具有静态或线程存储持续时间的对象是零初始化的,请参见 3.6.2。——尾注]

和(为了便于阅读,倒序排列):

8.5。初始化程序 [dcl.init] / 6

默认初始化T类型的对象意味着:

— 如果 T 是(可能是 cv 限定的)类类型(第 9 条),则调用 T 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化是非良构的);

— 如果 T 是数组类型,则每个元素都是默认初始化的;

否则,不执行初始化。 [强调我的]

如果程序要求对 const 限定类型 T 的对象进行默认初始化,则 T 应是具有用户提供的默认构造函数的类类型。

它们是默认初始化的。int对于像or之类的内置类型double,它们的值取决于声明结构的位置(根据经验(但同样如此):假设它们始终是垃圾,除非已初始化

在全局范围或/和static存储中,它们都是零(包括当结构是在全局范围内的结构的成员时)。

在函数局部范围内,它们充满了垃圾。

例子:

#include <iostream>

struct Foo {
    int x;
    int y;
};

Foo foo;

int main () {
    Foo bar;

    std::cout << foo.x << ":" << foo.y << '\n';
    std::cout << bar.x << ":" << bar.y << '\n';
}

这在第一次运行时给了我

0:0
-1077978680:12574708

在第二次运行时,无需重新编译,这给了我:

0:0
-1075556168:12574708

POD-struct 可以使用 egmemset或只是 ...

Foo foo = {0}; // C and C++03
Foo foo{0}; // C++11
于 2013-06-14T10:29:15.320 回答
3

不,在一般情况下,它们具有未指定的值。

如果你不喜欢这种行为,你可以提供一个构造函数:

struct A {
  double a;
  double b;

  A(): a(0.0), b(0.0) {}
}
于 2013-06-14T10:28:36.433 回答