是否默认将C++结构的成员初始化为0?

189 c++

我有这个struct:

struct Snapshot
{
    double x; 
    int y;
};
Run Code Online (Sandbox Code Playgroud)

我希望x并且y为0.默认情况下它们是0还是我必须这样做:

Snapshot s = {0,0};
Run Code Online (Sandbox Code Playgroud)

将结构归零的其他方法是什么?

Joh*_*itb 251

如果不初始化结构,它们不为null.

Snapshot s; // receives no initialization
Snapshot s = {}; // value initializes all members
Run Code Online (Sandbox Code Playgroud)

第二个将使所有成员为零,第一个将它们保留为未指定的值.请注意,它是递归的:

struct Parent { Snapshot s; };
Parent p; // receives no initialization
Parent p = {}; // value initializes all members
Run Code Online (Sandbox Code Playgroud)

第二个将p.s.{x,y}为零.如果在结构中有构造函数,则不能使用这些聚合初始化列表.如果是这种情况,则必须为这些构造函数添加适当的初始化

struct Snapshot {
    int x;
    double y;
    Snapshot():x(0),y(0) { }
    // other ctors / functions...
};
Run Code Online (Sandbox Code Playgroud)

将x和y初始化为0.请注意,您可以使用x(), y()初始化它们而忽略它们的类型:那就是值初始化,并且通常会产生一个正确的初始值(0表示int,0.0表示double,调用用户定义的默认构造函数具有用户声明的构造函数的类型,...).这非常重要,特别是如果您的结构是模板.

  • 这会在我的编译器中产生很多警告。 (2认同)
  • C++ 11现在允许您在结构或类的定义中初始化它们,如下所示:struct Snapshot {double x {0}; //用大括号int y = 0; //或者只是旧学校风格'通过assignement',这也是真正的初始化}; (2认同)
  • 是“快照 s = {};” 标准的一部分? (2认同)

Jar*_*Par 37

不,默认情况下它们不是0.确保所有值或默认为0的最简单方法是定义构造函数

Snapshot() : x(0), y(0) {
}
Run Code Online (Sandbox Code Playgroud)

这可确保快照的所有使用都具有初始化值.

  • 缺点是struct不再是POD类型,因为它有一个构造函数.这将打破一些操作,例如将其写入临时文件. (24认同)
  • @finnw:C++ 11修复了这个问题,虽然结构不是POD,但它是"标准布局". (15认同)

bdo*_*lan 18

一般来说,没有.但是,在函数/中声明为文件范围或静态的结构将被初始化为0(就像这些范围的所有其他变量一样):

int x; // 0
int y = 42; // 42
struct { int a, b; } foo; // 0, 0

void foo() {
  struct { int a, b; } bar; // undefined
  static struct { int c, d; } quux; // 0, 0
}
Run Code Online (Sandbox Code Playgroud)

  • 静态存储持续时间对象始终初始化为零 - 请参阅http://stackoverflow.com/questions/60653/is-global-memory-initialized-in-c/60707#60707以获取标准的引用.这是否是好风格是另一回事. (21认同)

And*_*rsK 12

有了POD你也可以写

Snapshot s = {};
Run Code Online (Sandbox Code Playgroud)

你不应该在C++中使用memset,memset的缺点是如果struct中有非POD,它会破坏它.

或者像这样:

struct init
{
  template <typename T>
  operator T * ()
  {
    return new T();
  }
};

Snapshot* s = init();
Run Code Online (Sandbox Code Playgroud)


Adr*_*iuk 7

在C++中,使用无参数构造函数.在C中你不能有构造函数,所以使用memset或者 - 有趣的解决方案 - 指定初始值设定项:

struct Snapshot s = { .x = 0.0, .y = 0.0 };
Run Code Online (Sandbox Code Playgroud)