猿问

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

我有这个struct

struct Snapshot{
    double x; 
    int y;};

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

Snapshot s = {0,0};

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


弑天下
浏览 532回答 3
3回答

隔江千里

如果不初始化结构,它们不为null。Snapshot s; // receives no initializationSnapshot s = {}; // value initializes all members第二个将使所有成员为零,第一个将它们保留为未指定的值。请注意,它是递归的:struct Parent { Snapshot s; };Parent p; // receives no initializationParent p = {}; // value initializes all members第二个将p.s.{x,y}为零。如果在结构中有构造函数,则不能使用这些聚合初始化列表。如果是这种情况,则必须为这些构造函数添加适当的初始化struct Snapshot {    int x;    double y;    Snapshot():x(0),y(0) { }    // other ctors / functions...};将x和y初始化为0.请注意,您可以使用x(), y()初始化它们而忽略它们的类型:那就是值初始化,并且通常会产生一个正确的初始值(0表示int,0.0表示double,调用用户定义的默认构造函数具有用户声明的构造函数的类型,...)。这非常重要,特别是如果您的结构是模板。

温温酱

不,默认情况下它们不是0。确保所有值或默认为0的最简单方法是定义构造函数Snapshot() : x(0), y(0) {}这可确保快照的所有使用都具有初始化值。

慕尼黑的夜晚无繁华

一般来说,没有。但是,在函数/中声明为文件范围或静态的结构将被初始化为0(就像这些范围的所有其他变量一样):int x; // 0int y = 42; // 42struct { int a, b; } foo; // 0, 0void foo() {  struct { int a, b; } bar; // undefined  static struct { int c, d; } quux; // 0, 0}
随时随地看视频慕课网APP
我要回答