0

S. Lippman の「inside c++ object model」という本を読みましたが、そのようなコードはありますか

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 オブジェクトがヒープ上に作成されました。上記の説明によると、このオブジェクトはグローバルではなく、既定のコンストラクターとは呼ばれません。私は正しく理解していますか?

4

3 に答える 3

1

これを行う場合:

Foo* baz = new Foo();

Fooインスタンスを動的に割り当て、値を初期化しています。POD の場合、これはメンバーがゼロで初期化されることを意味します。あなたがこれを言った場合(非グローバルなコンテキストを想定して):

Foo* baz = new Foo;

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

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

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.
于 2013-11-07T08:27:05.970 に答える
1

の括弧は、値の初期化new Foo()を指定します。これは基本的に、各メンバーがゼロで初期化されることを意味します。代わりに と言った場合、メンバーは自動変数用であるため、初期化されないままになります。new Foo

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

Foo bar{};        // C++11
Foo bar = Foo();  // Historical C++
于 2013-11-07T08:31:34.000 に答える
0

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

括弧の空のセットを追加するとnew Foo()、割り当てられたオブジェクトの値が初期化されます。これは、メンバーが「デフォルト」値に初期化されることを意味します。これは、整数値と浮動小数点値、およびnullptrポインターの場合はゼロです。

于 2013-11-07T08:25:07.740 に答える