C++ : DefaultMemberInitializer
C++ : member変数の初期化
C++でのmember変数の初期化と言えば、コンストラクタ初期化子でした。しかし、このstyleの初期化では、配列の初期化が行えない、などの問題がありました。const 配列にしたい場合はplacement newを使ったり、引数付きのclass変数を配列で定義する時に困ったり。
しかし、C++11以降で、この問題を解決する、デフォルトメンバ初期化子(default member initializer)と言うstyleが追加されたようなので、まとめておきます。
default member initializer
以下のような初期化styleです。
class TEMP{
private:
public:
int a = 1;
int b{2};
int c = {3};
TEMP() : c(9) {} //
int d[3] = {0, 1, 2};
};
従来のconstructor styleより、自然な形に思えます。また、コンストラクタ初期化子と、デフォルトメンバ初期化子が混在している場合は、コンストラクタ側が優先されます。
また、class変数をmemberにする場合は、以下のようにします。
class USER{
private:
ITEM item = ITEM(99);
ITEM items[5] = {ITEM(0), ITEM(1), ITEM(2), ITEM(3), ITEM(4), };
};
more study
class USER{
private:
ITEM item = ITEM(99);
ITEM items[5] = {ITEM(0), ITEM(1), ITEM(2), ITEM(3), ITEM(4), };
};
では、
compile時 : デフォルト コンストラクタ(引数付き)を使って、temporary変数を作成し、コピーコンストラクタで配列の要素を初期化
動作時 : デフォルト コンストラクタ(引数付き)のみがcallされる
と言う動きになる(compileの最適化でしょうか)
注意点としては、実動作時に通らないとは言え、copy constructorをprivateにすると、compileが通らない点です。
検討の詳細は、GitHub にupしてあります。
Source Code
参考URL
もしよろしければ、サポートをお願いします! 頂いたサポートは、Creatorとしての活動費に充てさせて頂きます。