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

GitHub

参考URL

* C++ メンバ変数の初期化|コンストラクタでの初期化とメンバ宣言時の初期化

もしよろしければ、サポートをお願いします! 頂いたサポートは、Creatorとしての活動費に充てさせて頂きます。