4

重複の可能性:
次の句は C++ で何を意味しますか: ゼロ、デフォルト、および値の初期化?

C++ の問題について混乱しています。

デフォルトのコンストラクターを使用してスタック上にオブジェクトを作成する場合、次の 2 つの構文表記のいずれかで同じ結果が得られると考えました。

class MyClass { public: int i; }
int main()
{
  MyClass a = MyClass();
  MyClass b;
}

ただし、最初の構文はフィールドをゼロに初期化しますが、2 番目の構文はフィールドを初期化しないままにします。だから私の質問は:

  1. これはなぜですか?C++ のフィールドは自動的に初期化されるはずがないと思っていました。
  2. 2 つの構文の間に他に違いはありますか?
  3. これらの構文バリエーションは、互いに区別するために個別の名前を持っていますか?

現在、Microsoft Visual C++ 2010 Express を使用しています。ありがとう!

4

2 に答える 2

7

最初に、値で初期化された のインスタンスからコピーして初期 化します。C++03 標準、§8.5/7 から:aMyClass

初期化子が括弧の空のセット、つまり () であるオブジェクトは、値で初期化されます。

そして§8.5/5から:

タイプのオブジェクトを値で初期化Tするとは、次のことを意味します。

  • ユーザーが宣言したコンストラクターを持つクラス型の場合T、デフォルトのコンストラクターTが呼び出されます (アクセス可能なデフォルトのコンストラクターがない場合、初期化は整形式でTはありません)。
  • ユーザーが宣言したコンストラクターを持たない非共用体クラス型の場合T、すべての非静的データ メンバーと基本クラス コンポーネントTは値で初期化されます。
  • が配列型の場合T、各要素は値で初期化されます。
  • それ以外の場合、オブジェクトはゼロで初期化されます

タイプのオブジェクトをゼロで初期化Tするとは、次のことを意味します。

  • がスカラー型の場合T、オブジェクトは0(ゼロ) に変換された値に設定されTます。
  • T非共用体クラス型の場合、各非静的データ メンバーと各基本クラス サブオブジェクトはゼロで初期化されます。
  • Tが共用体型の場合、オブジェクトの最初の名前付きデータ メンバー) はゼロで初期化されます。
  • が配列型の場合T、各要素はゼロで初期化されます。
  • Tが参照型の場合、初期化は実行されません。

2 番目の例では、POD タイプでない場合にデフォルトで初期化bされるような方法で宣言します-- §8.5/5:MyClass

タイプ T のオブジェクトをデフォルトで初期化するとは、次のことを意味します。

  • T非 POD クラス タイプの場合、デフォルト コンストラクタTが呼び出されます(アクセス可能なデフォルト コンストラクタがない場合、初期化は不適切な形式Tです)。
  • が配列型の場合T、各要素はデフォルトで初期化されます。
  • それ以外の場合、オブジェクトはゼロで初期化されます。

ただし、MyClassPOD タイプであるため、b初期化されていません -- §8.5/9:

オブジェクトに初期化子が指定されておらず、オブジェクトが (おそらく cv 修飾された) 非 POD クラス型 (またはその配列) である場合、オブジェクトはデフォルトで初期化されます。オブジェクトが const 修飾された型の場合、基になるクラス型には、ユーザーが宣言した既定のコンストラクターが必要です。それ以外の場合、非静的オブジェクトに対して初期化子が指定されていない場合、オブジェクトとそのサブオブジェクト (存在する場合) の初期値は不確定です。オブジェクトまたはそのサブオブジェクトのいずれかが const 修飾された型である場合、プログラムは不正な形式です。

于 2011-06-28T19:29:14.383 に答える
-1

基本的に、これは言語の (比較的) 単純な WTF であり、プリミティブ型は既定では初期化されません。最初の構文はそれらを明示的に初期化しますが、2 番目の構文はそうではありません。ユーザー定義型は常に初期化されるため、コンストラクターで初期化しない場合にのみ意味があり、ユーザー定義型を必要とする UDT の init 関数を呼び出さないとエラーになります。

何も異常なことをしない UDT は、最初の構文を必要とすべきではなく、2 番目の構文を使用するのが普通です。

于 2011-06-28T19:23:10.110 に答える