4

C++ 標準は次のように述べています (8.5/5):

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

  • T非 POD クラス型 (節 9) の場合、 のデフォルト コンストラクターTが呼び出されます (Tアクセス可能なデフォルト コンストラクターがない場合、初期化の形式は正しくありません)。

  • Tが配列型の場合、各要素はデフォルトで初期化されます。

  • それ以外の場合、オブジェクトはゼロで初期化されます。

このコードで

struct Int { int i; };

int main()
{
    Int a;
}

オブジェクトaはデフォルトで初期化されていますが、a.i必ずしも 0 に等しいとは限りません。IntPOD は配列ではなく、標準と矛盾しませんか?

編集classからに 変更されstructIntPOD になりました。

4

3 に答える 3

6

2003年標準の8.5.9から:

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

表示するクラスはPODであるため、強調表示された部分が適用され、オブジェクトはまったく初期化されません(引用したセクション8.5/5はまったく適用されません)。

編集:あなたのコメントによると、ここでは現在の標準の最終作業草案のセクション8.5 / 5からの引用です(私は実際の標準を持っていませんが、FDISはおそらく非常に近いです):

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

— T が (おそらく cv 修飾された) クラス型 (第 9 節) である場合、T のデフォルト コンストラクターが呼び出されます (T にアクセス可能なデフォルト コンストラクターがない場合、初期化の形式は正しくありません)。

— T が配列型の場合、各要素はデフォルトで初期化されます。

それ以外の場合、初期化は実行されません。

于 2011-11-24T11:35:06.893 に答える
1

変数が初期化されていません。使用する

Int a = Int();

POD を初期化するか、標準コンストラクターを宣言して非 POD にします。ただし、次のようなパフォーマンス上の理由から、POD を初期化せずに使用することもできます。

Int a;
a.i = 5;
于 2011-11-24T12:25:06.477 に答える
0

いいえ、オブジェクトaはデフォルトで初期化されていません。デフォルトで初期化したい場合は、次のように言わなければなりません:

Int a = Int() ;
于 2011-11-24T11:37:09.513 に答える