C++11--このように初期化リストを遊ぶことができますか?


C++11には初期化リストが追加されていることがわかり、以前のブログでも紹介されていました.C++の初期化リスト(賦値と初期化を区別する)c++11特性のinitializer_listを浅く分析する
今日はこのように初期化リストを使うことについて議論します.
まずクラスを書きます.
class SimpleType
{
private:
    int a { 1 };    // << wow!
    int b { 1 };    // << wow2!
    string name { "string" }; // wow3!

public:
    SimpleType() {
        cout << "SimpleType::ctor, {" 
                  << a << ", " 
                  << b << ", \"" 
                  << name << "\"}" 
                  << endl;
    }
    ~SimpleType() { 
        cout << "SimpleType::destructor" << endl; 
    }
};

このクラスを使用します.
SimpleType obj;

出力:SimpleType::ctor,{1,1,"string"}
1簡潔2初期メンバー変数を忘れない3いくつかの構造関数がある場合、このように書くともっとメリットがあります.
上のクラスを簡単に変更できます.
class SimpleType
{
private:
    int a { 1 };    // << wow!
    int b { 1 };    // << wow2!
    string name { "string" }; // wow3!

public:
    SimpleType() { /* old code... */ }
    SimpleType(int aa, int bb) 
        : a(aa), b(bb) // << custom init!
    {
    std::cout << "SimpleType::ctor(aa, bb), {"  
        << a << ", " 
        << b << ", \"" 
        << name << "\"}" 
        << std::endl;
    }
    ~SimpleType() { 
        cout << "SimpleType::destructor" << endl; 
    }
};

変更されたクラスを使用するには、次の手順に従います.
class AdvancedType
{
private:
    SimpleType simple;

public:
    AdvancedType() {
        cout << "AdvancedType::ctor" << endl;
    }
    AdvancedType(int a) : simple(a, a) {
        cout << "AdvancedType::ctor(a)" << endl;
    }
    ~AdvancedType() { 
        cout << "AdvancedType::destructor" << endl; 
    }
};

次の操作を行います.
AdvancedType adv;

出力:
SimpleType::ctor, {1, 1, "string"}
AdvancedType::ctor

次の操作を行います.
AdvancedType advObj2(10);

出力:
SimpleType::ctor(aa, bb), {10, 10, "string"}
AdvancedType::ctor(a)

副作用:vectorなど、空のメンバー変数がほしい場合.