質問
UDTの配列はデフォルトで初期化されているのに対し、組み込み型の配列はユニット化されていると確信しています。
int foo [5]; //ジャンク
が含まれます
Foo foo [5]; //デフォルトで初期化される5つのFooオブジェクトが含まれます
これは、配列がスタックまたはヒープに割り当てられているかどうかに関係なく発生します。
しかし、これに関する信頼できる情報源を見つけるのは難しいと思っています。 Bjarneは次のように述べています。
"配列および構造のメンバーは、配列または構造が静的であるかどうかに応じてデフォルトで初期化されるかどうかによって決まりますあまり多くを教えてくれません。
標準で何かを見つけようとしましたが、これまでのところ利用できません。
上記を確認するための信頼できる情報源を知っている人はいますか?
解決
ISO C ++ 03は、取得するほど権威があります:
POD構造体は、非POD構造体、非POD共用体(またはそのような型の配列)、または参照型の非静的データメンバーを持たない集約クラスであり、ユーザー定義のコピー割り当てはありません演算子であり、ユーザー定義のデストラクターはありません。同様に、PODユニオンは、非POD構造体、非PODユニオン(またはそのようなタイプの配列)、または参照型の非静的データメンバーがなく、ユーザー定義のコピー割り当て演算子がない集約ユニオンです。ユーザー定義のデストラクタはありません。 PODクラスは、POD構造体またはPODユニオンのいずれかのクラスです。
算術型(3.9.1)、列挙型、ポインター型、およびメンバー型へのポインター(3.9.2)、およびこれらの型のcv修飾バージョン(3.9.3)は、まとめてスカラー型と呼ばれます。スカラー型、POD構造体型、POD共用体型(9節)、そのような型の配列、およびこれらの型のcv修飾バージョン(3.9.3)は、まとめてPOD型と呼ばれます。
タイプTのオブジェクトをゼロで初期化するとは、次のことを意味します。
- Tがスカラー型(3.9)の場合、オブジェクトはTに変換された0(ゼロ)の値に設定されます。
- Tが非ユニオンクラスタイプの場合、各非静的データメンバーと各ベースクラス サブオブジェクトはゼロで初期化されます。
- Tがユニオン型の場合、オブジェクトの最初の名前付きデータメンバーはゼロで初期化されます;
- Tが配列型の場合、各要素はゼロで初期化されます;
- Tが参照型の場合、初期化は実行されません。
タイプTのオブジェクトをデフォルトで初期化するということは、次のことを意味します。
- Tが非PODクラス型(9節)の場合、Tのデフォルトコンストラクターが呼び出されます(Tにアクセス可能なデフォルトコンストラクターがない場合、初期化は不正な形式です);
- Tが配列型の場合、各要素はデフォルトで初期化されます。
- それ以外の場合、オブジェクトはゼロで初期化されます。
タイプTのオブジェクトの値を初期化するということは、次のことを意味します。
- Tがユーザー宣言コンストラクター(12.1)を持つクラス型(9節)である場合、Tのデフォルトコンストラクターが呼び出されます(Tにアクセス可能なデフォルトコンストラクターがない場合、初期化は不正な形式です);
- Tがユーザー宣言コンストラクターを持たない非共用クラス型である場合、Tのすべての非静的データメンバーとベースクラスコンポーネントは値で初期化されます。
- Tが配列型の場合、各要素は値で初期化されます;
- それ以外の場合、オブジェクトはゼロで初期化されます
静的ストレージ期間のすべてのオブジェクトは、他の初期化が行われる前に、プログラムの起動時にゼロで初期化されます。 [注:場合によっては、追加の初期化が後で行われます。]
イニシャライザが空の括弧のセット、つまり()であるオブジェクトは、値で初期化されます。
オブジェクトに初期化子が指定されておらず、オブジェクトが(おそらくcv修飾された)非PODクラス型(またはその配列)である場合、オブジェクトはデフォルトで初期化されます。オブジェクトがconst修飾型である場合、基礎となるクラス型にはユーザーが宣言したデフォルトコンストラクターが必要です。そうではなく、非静的オブジェクトに初期化子が指定されていない場合、オブジェクトとそのサブオブジェクト(存在する場合)の初期値は不定です。オブジェクトまたはそのサブオブジェクトのいずれかがconst修飾型である場合、プログラムは不正な形式です。
例では、 int
は間違いなくPOD型(算術型)であるため、初期化子が存在しない場合、 int
型のローカルまたはフィールドです。値は不定になります。 Foo
の場合、これは定義方法に依存します-大まかに言えば、コンストラクターがなく、そのすべてのメンバーがPODタイプである場合、それ自体はPODタイプであり、初期化はありませんどちらかが行われます。それ以外の場合は、デフォルトのコンストラクターが呼び出されます。それでも、これは members が初期化されることを意味しません-ルールが繰り返されます
他のヒント
8.5.9のC ++標準には次のように記載されています。
イニシャライザが指定されていない場合 オブジェクト、およびオブジェクトの(おそらく cv修飾)非PODクラスタイプ(または その配列)、オブジェクトは デフォルトで初期化されました。オブジェクトが const修飾型の 基になるクラス型には ユーザーが宣言したデフォルトのコンストラクタ。 それ以外の場合、初期化子が 非静的オブジェクトに指定された場合、 オブジェクトとそのサブオブジェクト(ある場合) 不定の初期値があります。
"配列および構造のメンバーは、配列または構造が静的であるかどうかに応じてデフォルトで初期化されるかどうかによって決まります
これは信頼できますが、より明確になる可能性があります:
-
static
として宣言された配列と構造体はゼロに初期化されます。 - 組み込み型のローカル配列および構造体(コンストラクターを持たない i.e。型など)は初期化されません。