首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >默认情况下,C++结构的成员是否初始化为0?

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

Stack Overflow用户
提问于 2009-07-01 14:58:40
回答 9查看 179K关注 0票数 226

我有这个struct

代码语言:javascript
复制
struct Snapshot
{
    double x; 
    int y;
};

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

代码语言:javascript
复制
Snapshot s = {0,0};

还有什么其他方法可以将结构归零?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-07-01 15:00:34

如果你不初始化结构,它们就不是空的。

代码语言:javascript
复制
Snapshot s; // receives no initialization
Snapshot s = {}; // value initializes all members

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

代码语言:javascript
复制
struct Parent { Snapshot s; };
Parent p; // receives no initialization
Parent p = {}; // value initializes all members

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

代码语言:javascript
复制
struct Snapshot {
    int x;
    double y;
    Snapshot():x(0),y(0) { }
    // other ctors / functions...
};

将x和y都初始化为0。请注意,您可以使用x(), y()来初始化它们,而不考虑它们的类型:这就是值初始化,通常会产生一个适当的初始值(0表示整型,0.0表示双精度型,为具有用户声明的构造函数的用户定义类型调用默认构造函数,...)。当你的结构是一个模板时,这一点尤其重要。

票数 298
EN

Stack Overflow用户

发布于 2009-07-01 15:00:38

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

代码语言:javascript
复制
Snapshot() : x(0), y(0) {
}

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

票数 42
EN

Stack Overflow用户

发布于 2009-07-01 15:07:55

一般来说,不是。但是,在函数/中声明为file-scope或static的结构将被初始化为0(就像那些作用域中的所有其他变量一样):

代码语言:javascript
复制
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
}
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1069621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档