デフォルト初期化
提供: cppreference.com
変数が初期化子なしで構築されたときに行われる初期化です。
目次 |
[編集] 構文
T object ;
|
(1) | ||||||||
new T
|
(2) | ||||||||
[編集] 説明
デフォルト初期化は以下の3つの状況で行われます。
1) 自動、静的、またはスレッドローカル記憶域期間を持つ変数が初期化子なしで宣言されたとき。
3) 基底クラスまたは非静的データメンバがコンストラクタの初期化子リストに記述されておらず、そのコンストラクタが呼ばれたとき。
デフォルト初期化の効果は以下の通りです。
-
T
が POD でない (C++11未満)クラス型の場合は、そのコンストラクタが考慮され、空の引数リストに対するオーバーロード解決の対象となります。 選択されたコンストラクタ (デフォルトコンストラクタのいずれかになります) がその新しいオブジェクトに初期値を提供するために呼ばれます。 -
T
が配列型の場合は、その配列の要素がデフォルト初期化されます。 - そうでなければ、何も行われません。 自動記憶域期間を持つオブジェクト (およびその部分オブジェクト) は不定値に初期化されます。
初期化子が使用されない場合は、自動記憶域期間を持つ POD でないクラス型 (またはその cv 修飾された型) (またはその配列) のみがデフォルト初期化されるものとみなされます。 動的記憶域期間を持つスカラー型および POD 型は、初期化されないものとみなされます (C++11 以降、この状況はデフォルト初期化の形式のひとつとして分類し直されました)。 |
(C++11未満) |
C++03 (値初期化が導入された) 未満では、式 new T() および基底クラスまたはメンバのメンバ初期化子の空の括弧の形式はデフォルト初期化と分類されますが、非クラス型の場合はゼロ初期化と規定されています。 |
(C++03未満) |
|
(C++11未満) |
何らかの型の非クラス変数をデフォルト初期化することによって取得した不定値の使用は未定義動作です (特に、トラップ表現である可能性があります)。 ただし以下の場合は除きます。
int f(bool b) { int x; // OK。 x の値は不定です。 int y = x; // 未定義動作。 unsigned char c; // OK。 c の値は不定です。 unsigned char d = c; // OK。 d の値は不定です。 int e = d; // 未定義動作。 return b ? d : 0; // b が真の場合は未定義動作。 } |
(C++14以上) |
[編集] ノート
自動および動的記憶域期間を持つ非クラス変数のデフォルト初期化は不定値を持つオブジェクトを生成します (静的およびスレッドローカルなオブジェクトはゼロ初期化されます)。
T
が const 修飾された型の場合は、ユーザ提供のデフォルトコンストラクタを持つクラス型でなければなりません。
参照はデフォルト初期化できません。
[編集] 例
Run this code
#include <string> struct T1 { int mem; }; struct T2 { int mem; T2() { } // 注:「mem」が初期化子リストにありません。 }; int n; // 静的な非クラス。 2段階の初期化が行われます。 // 1) ゼロ初期化が n をゼロに初期化します。 // 2) デフォルト初期化は何もしません。 n はゼロのままになります。 int main() { int n; // 非クラス。 値は不定です。 std::string s; // クラス。 デフォルトコンストラクタを呼びます。 値は "" (空文字列) です。 std::string a[2]; // 配列。 要素をデフォルト初期化します。 値は {"", ""} です。 // int& r; // エラー。 参照。 // const int n; // エラー。 const な非クラス。 // const T1 t1; // エラー。 暗黙のデフォルトコンストラクタを持つ const なクラス。 T1 t1; // クラス。 暗黙のデフォルトコンストラクタを呼びます。 const T2 t2; // const なクラス。 ユーザ定義のデフォルトコンストラクタを呼びます。 // t2.mem はデフォルト初期化されます (不定値になります)。 }