2

そのため、C++ での初期化の規則を理解しようと懸命に努力しています。

次のコードを書きました。

struct B {
  int i;

  // this prevents the definition of an implicit default constructor
  B( int j ) : i(j) {}

};

struct C {
  int i;

  // i is not mentioned in the initializer list
  // the compiler will call default constructor for i
  C() {}

};


int main() {

  int x( 1 );
  cout << " x = " << x << endl;

  // error: no matching function for call to ‘B::B()’
  //B b4 = B();
  //cout << " b4.i = " << b4.i << endl;

  C c1;
  cout << " c1.i = " << c1.i << endl;
}

1) x は正しく 1 に初期化されていますが、"int x(1)" という表記がわかりません。値で初期化されていません ("int x = int()" と書くと、x は 0 になります)。組み込み型にはコンストラクターがないため、コンストラクター呼び出しでもありません。また、次のページには、「コンストラクターを持つクラスのオブジェクトのみが関数スタイルの構文で初期化できる」と明確に記載されています。

http://msdn.microsoft.com/en-us/library/w7wd1177(v=vs.100).aspx

2) b4 の作成をコメント解除するとコンパイルされません。コンストラクターを定義したため、コンパイラーは暗黙のデフォルト コンストラクターを生成しません。これで問題ありません。しかし、これにより、「B()」を使用して一時的に値を初期化したオブジェクトを作成できないのはなぜでしょうか? "B()" と書くのは決してコンストラクター呼び出しではありませんね。

3) クラス C のコメントで説明されているように、 i は初期化子リストに記載されていません。したがって、デフォルトで初期化する必要があります。これは、int 型に対して未定義であることを意味します。しかし、プログラムを実行するたびに出力は「c1.i = 0」です。

ありがとう。

4

3 に答える 3

3
  1. int x(1);int x = 1;組み込み型の書き込みと同じです。

  2. ユーザー定義のコンストラクター (非集計)を持つ型の場合、書き込みT() は常に既定のコンストラクターを呼び出します。そのため、コードはコンパイルされません。

  3. c1.i実際には初期化されておらず、それを読み取ることは未定義の動作です。特に最適化を有効にしていない場合は、コンパイラがメモリをゼロにしている可能性があります。または、たまたまゼロが出力される可能性があります。あなたは確かにこの振る舞いを当てにすることはできません. これは、ガベージ印刷のclangからの出力です。

于 2013-07-18T02:59:28.387 に答える
2
  1. この表記int x(1);は、直接初期化と呼ばれます。ネイティブ型とクラスで別々に定義されています。後者の場合、コンストラクターが呼び出されます。

  2. この場合、デフォルトのコンストラクターがない場合、値の初期化などはありません。一時オブジェクトを構築するためのルールは、名前付きオブジェクトを構築するためのルールと同じです。

  3. 初期化されていない値を読み取ると、未定義の動作が発生します。同じプログラムを再度実行すると、常に同じ結果が得られる可能性がありますが、他のプログラム、他のマシン、他のプラットフォームを試すと、別のことが起こる可能性があります (または起こらない可能性があります)。未定義とは文字通り、標準によって未定義であることを意味し、クラッシュやランダム、またはエラー メッセージの生成ではありません。

    すべての賢明な人々を含む、利用可能な最良の仕様の保証のみに依存する人々にとって、未定義の動作を伴うプログラムは正しくなく、予期しないときにクラッシュすると想定できます。

于 2013-07-18T03:01:41.330 に答える
0

プログラムをデバッグ モードで実行すると、次のように表示されます。

c1.i = -858993460

これは "CCCCC...CC" の値です。これは、C++ デバッグ モードで初期化されていない値のデフォルト値です。

于 2014-11-10T14:55:04.437 に答える