質問

私は「C ++オブジェクトモデルの内部」という本S. lippmanを読みました、そのようなコードはありますか

class Foo { public: int val; Foo *pnext; };
void foo_bar()
{
// Oops: program needs bar's members zeroed out
Foo bar;
Foo* baz = new Foo(); // this line i added myself
if ( bar.val || bar.pnext )
// ... do something
// ...
}

また、「デフォルトのコンストラクターは、このコードフラグメントの合成されていません。

グローバルオブジェクトは、プログラムの起動時に関連するメモリを「ゼロアウト」することが保証されています。プログラムスタックに割り当てられたローカルオブジェクトとフリーストアに割り当てられたヒープオブジェクトは、関連するメモリがゼロになっていません。むしろ、メモリは以前の使用の任意のビットパターンを保持します。」

このコードでは、BAZオブジェクトがヒープに作成され、上で言われたことに従って、このオブジェクトはグローバルではなく、デフォルトのコンストラクターとは呼ばれません。私は正しく理解していますか?

役に立ちましたか?

解決

括弧内 new Foo() 特定 値の初期化;これは基本的に、各メンバーがゼロイニタイアル化されていることを意味します。代わりにあなたが言った場合 new Foo, 、その後、メンバーは自動変数用であるため、無知のままになります。

残念ながら、自動変数をvalualingialiseするには、書くことができません Foo bar(), 、それが関数を宣言するので。あなたは必要になるでしょう

Foo bar{};        // C++11
Foo bar = Foo();  // Historical C++

他のヒント

あなたがこれをするとき:

Foo* baz = new Foo();

あなたは動的にaを割り当てています Foo インスタンスと 価値イテリア化 それ。ポッドの場合、これはメンバーがゼロイナイト化されることを意味します。あなたがこれを言っていたなら(非グロバルの文脈を仮定して):

Foo* baz = new Foo;

そうして Foo インスタンスはデフォルトの初期化されます。これは、ポッドであるため、メンバーの初期化が実行されないことを意味します。

これは、自動ストレージインスタンスにも適用されます。

Foo f0; // default initializaiton: members not zeroed out.
Foo f1 = Foo(); // value initialization: members zeroed out.
Foo f2{}; // C++11 value initialization: members zeroed out.
Foo f3(); // Ooops! Function declaration. Something completely different.

クラスにデフォルトのコンストラクター(および他のコンストラクターがない)がない場合、コンパイラはあなたのためにそれを作成します。それが必要です、またはあなたはクラスのインスタンスを作成することができません。ただし、生成されたデフォルトコンストラクターは何もしません。

空の括弧のセットを追加するもの new Foo() doは、割り当てられたオブジェクトを初期化することです。つまり、メンバーは「デフォルト」値に初期化されます。 nullptr ポインター用。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top