[C++] C ++の構造体のメンバーは、デフォルトで0に初期化されていますか?


Answers

いいえ、デフォルトでは0ではありません。 すべての値が0であることを保証する最も簡単な方法は、コンストラクタを定義することです

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

これにより、Snapshotのすべての使用が初期化された値になります。

Question

私はこのstructを持っています:

struct Snapshot
{
    double x; 
    int y;
};

私はxyを0にします。これらはデフォルトで0になるでしょうか、それともする必要がありますか?

Snapshot s = {0,0};

構造をゼロにする他の方法は何ですか?




これはPOD(本質的にCの構造体)なので、C言語の方法を初期化する際の害はほとんどありません。

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

または同様に

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

私はC ++プログラムでcalloc()を使用するまでは行っていません。




ポッドメンバーをベースクラスに移動してイニシャライザーリストを短くします:

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



PODを使用すると、

Snapshot s = {};

C ++でmemsetを使うべきではありません。memsetには構造体に非PODがあればそれを破壊するという欠点があります。

またはこのように:

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

Snapshot* s = init();






Tags