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

时间:2009-07-01 14:58:40

标签: c++

我有struct

struct Snapshot
{
    double x; 
    int y;
};

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

Snapshot s = {0,0};

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

8 个答案:

答案 0 :(得分:239)

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

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

第二个会使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 ,为具有用户声明的构造函数的用户定义类型调用默认构造函数,...)。这非常重要,特别是如果您的结构是模板。

答案 1 :(得分:37)

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

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

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

答案 2 :(得分:18)

一般来说,没有。但是,在函数/中声明为文件范围或静态的结构将被初始化为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
}

答案 3 :(得分:12)

使用POD你也可以写

Snapshot s = {};

你不应该在C ++中使用memset,memset的缺点是如果结构中存在非POD,它将会破坏它。

或者像这样:

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

Snapshot* s = init();

答案 4 :(得分:7)

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

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

答案 5 :(得分:4)

由于这是一个POD(基本上是一个C结构),因此用C方式初始化它几乎没有什么害处:

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

或类似地

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

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

答案 6 :(得分:3)

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

答案 7 :(得分:2)

将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());
}