ホームに戻る
出典 :
C++ メンバ変数の初期化|コンストラクタでの初期化とメンバ宣言時の初期化 | MaryCore
関連 :
C++11 コンストラクタ初期化子 一様初期化
目次 :

デフォルトメンバ初期化子

クラス(および構造体など)のメンバ変数を宣言時に初期化する機能および構文。C++11で追加された。

従来との比較

C++03まで : コンストラクタによる初期化
struct T { int member; // コンストラクタ T() : member(9) {} };
C++11以降 : デフォルトメンバ初期化子による初期化
struct T { int member = 9; //< member は 9 で初期化される };
C++03以前は、メンバ変数はコンストラクタを用いる以外に初期化の手段が無く、特に有意な処理を行わない場合でもコンストラクタを記述する必要があった。
C++11からは、デフォルトメンバ初期化子によってメンバ変数を宣言時に初期化することができるため、コンストラクタを省略することが可能となった
デフォルトメンバ初期化子はあくまで、「コンストラクタ初期化子が指定されなかった場合にデフォルトで適用される値」であり、
コンストラクタ初期化子との併用が可能である。

記法と原則

struct T { int a = 1; //< = 演算子による初期化 int b {2}; //< {} (波括弧)による初期化 int c = {3}; //< = 演算子と {} による初期化 // コンストラクタ // コンストラクタ初期化子で c を初期化 ⇒ デフォルト初期化子を上書き T() : c(9) {} };
デフォルトメンバ初期化子は、上記のような記法で指定できる。
ここで、コンストラクタ初期化子が指定されている場合はそちらが優先される
これは関数における、デフォルト引数と実引数の関係と同様である。
(上記の例では、変数 a 、b にはデフォルト初期化子が適用され、値は 1 、2 となるが、
変数 c はコンストラクタ側のメンバ初期化子が優先されるため、値は 3 ではなく 9 となる。)

注意が必要な点 : 初期化子リストとの組み合わせ

struct T { int a = 1, b = 2; //< デフォルト初期化子 }; : void DoSomething() { T sample01 { }; //< 空の初期化子リスト ⇒ OK T sample02 {9 }; //< 初期化子リストで a を初期化 ⇒ NG T sample03 {9, 8}; //< 初期化子リストで a および b を初期化 ⇒ NG }
C++11ではデフォルト初期化子と初期化子リストとの併用が許可されておらず、初期化子リストで初期化を行おうとするとエラーとなる。
(但し sample01 の初期化はリストが空のため、この行のみはエラーとはならない。)
C++14以降であればエラーとはならず、問題なく使用できる。