默认情况下,C ++结构的成员是否初始化为0?

我有这个struct

  struct Snapshot { double x; int y ; }; 

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

 Snapshot s= {0,0}; 

有什么其他的方法来消除结构?

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

 Snapshot s; // receives no initialization Snapshot s = {}; // value initializes all members 

第二个将使所有成员为零,第一个离开他们在未指定的价值。 请注意,它是recursion的:

 struct Parent { Snapshot s; }; Parent p; // receives no initialization Parent p = {}; // value initializes all members 

第二个将使ps{x,y}为零。 如果你的结构体中有构造函数,你不能使用这些聚合初始值设定项列表。 如果是这样,你将不得不为这些构造函数添加适当的初始化

 struct Snapshot { int x; double y; Snapshot():x(0),y(0) { } // other ctors / functions... }; 

将x和y初始化为0.请注意,可以使用x(), y()来初始化它们,忽略它们的types:然后是值初始化,并且通常会产生一个合适的初始值(0代表int,0.0代表double,调用具有用户声明构造函数的用户定义types的默认构造函数,…)。 如果你的结构是一个模板,这个特别重要。

不,它们不是默认的0。 确保所有值或默认为0的最简单方法是定义一个构造函数

 Snapshot() : x(0), y(0) { } 

这确保所有使用快照将具有初始化值。

一般来说,没有。 然而,在函数/将被初始化为0(就像这些作用域的所有其他variables)一样,声明为文件作用域或静态的结构:

 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 } 

用POD你也可以写

 Snapshot s = {}; 

你不应该在C ++中使用memset,memset的缺点是如果结构中有一个非POD,它将会销毁它。

或者像这样:

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

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

 struct Snapshot s = { .x = 0.0, .y = 0.0 }; 

由于这是一个POD(本质上是一个C结构),所以初始化它的C方式几乎没有什么坏处:

 Snapshot s; memset(&s, 0, sizeof (s)); 

或类似地

 Snapshot *sp = new Snapshot; memset(sp, 0, sizeof (*sp)); 

我不会去在C ++程序中使用calloc()

我相信正确的答案是他们的价值观是不确定的。 运行代码的debugging版本时,它们经常被初始化为0。 运行发行版本时通常不是这种情况。

将pod成员移动到基类以缩短您的初始化程序列表:

 struct foo_pod { int x; int y; int z; }; struct foo : foo_pod { std::string name; foo(std::string name) : foo_pod() , name(name) { } }; int main() { foo f("bar"); printf("%d %d %d %s\n", fx, fy, fz, f.name.c_str()); }