データ メンバーがデフォルトで初期化されたままになるのではなく、値に初期化されるようにするにはどうすればよいですか? 質問する

データ メンバーがデフォルトで初期化されたままになるのではなく、値に初期化されるようにするにはどうすればよいですか? 質問する

今朝、自分自身に何かを尋ねていたのですが、それを適切に「グーグル」で検索する言葉が見つかりません。

たとえば、次のようなものがあるとします。

struct Foo
{
  int bar;
};

struct Foo2
{
   int bar;
   Foo2() {}
};

struct Foo3
{
   int bar;
   Foo3() : bar(0) {}
};

さて、もし私がデフォルト初期化 FooFoo2そしてFoo3

Foo foo;
Foo2 foo2;
Foo3 foo3;

barどのような場合にメンバーは適切に初期化されたつまり、その値は不確定ではないということですか?


注:Foo3明らかに初期化されています。 との違いを示すためだけにここに表示されているのでFoo2、質問は主に最初の 2 つに関するものです。

ベストアンサー1

すべてのコンテキストに存在するのは foo3 のみです。静的持続期間の場合、foo2 と foo も存在します。Foo 型のオブジェクトは、他のコンテキストではゼロ初期化される可能性があることに注意してください。

Foo* foo = new Foo(); // will initialize bar to 0
Foo* foox = new Foo; // will not initialize bar to 0

一方、Foo2 では次のことは起こりません。

Foo2* foo = new Foo2(); // will not initialize bar to 0
Foo2* foox = new Foo2; // will not initialize bar to 0

その領域は扱いが難しいです。C++98 と C++03 の間で文言が変更され、記憶が正しければ C++0X でも変更されたので、それに依存することは避けます。

struct Foo4
{
   int bar;
   Foo4() : bar() {}
};

bar も常に初期化されます。

おすすめ記事