默认情况下,C ++结构的成员是否初始化为0?
我有这个struct
:
struct Snapshot { double x; int y ; };
我希望x
和y
为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()); }