[英]Are members of a C++ struct initialized to 0 by default?
我有这个struct
:
struct Snapshot
{
double x;
int y;
};
我希望x
和y
为 0。默认情况下它们是 0 还是我必须这样做:
Snapshot s = {0,0};
将结构归零的其他方法是什么?
如果您不初始化结构,它们就不为空。
Snapshot s; // receives no initialization
Snapshot s = {}; // value initializes all members
第二个将使所有成员为零,第一个将它们保留为未指定的值。 请注意,它是递归的:
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()
来初始化它们,而不管它们的类型:这就是值初始化,通常会产生一个适当的初始值(0 表示 int,0.0 表示 double,为具有用户声明的构造函数的用户定义类型调用默认构造函数,...)。 这很重要,特别是如果您的结构是模板。
不,默认情况下它们不是 0。 确保所有值或默认为 0 的最简单方法是定义一个构造函数
Snapshot() : x(0), y(0) {
}
这可确保所有 Snapshot 使用都具有初始化值。
一般来说,没有。 但是,在函数中声明为文件范围或静态的结构 /will/ 将被初始化为 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
}
使用 POD,您还可以编写
Snapshot s = {};
你不应该在 C++ 中使用 memset,memset 有一个缺点,如果结构中有一个非 POD,它会破坏它。
或者像这样:
struct init
{
template <typename T>
operator T * ()
{
return new T();
}
};
Snapshot* s = init();
在 C++ 中,使用无参数构造函数。 在 C 中你不能有构造函数,所以使用memset
或 - 有趣的解决方案 - 指定的初始值设定项:
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()
。
我相信正确的答案是他们的价值观是未定义的。 通常,在运行代码的调试版本时,它们被初始化为 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", f.x, f.y, f.z, f.name.c_str());
}
我知道这个问题太老了,但这个问题在谷歌上突然出现,我发现了另一种方式,并认为我会在这里添加它:
Snapshot s {};
我不确定此语法需要什么 C/C++ 语言版本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.