かっこ初期化

class のコンストラクターの定義は、コンストラクターが比較的単純な場合は特に、必ずしも必要ではありません。 ユーザーは、次の例に示すように、均一初期化を使用して class または struct のオブジェクトを初期化できます。

// no_constructor.cpp
// Compile with: cl /EHsc no_constructor.cpp
#include <time.h>

// No constructor
struct TempData
{
    int StationId;
    time_t timeSet;
    double current;
    double maxTemp;
    double minTemp;
};

// Has a constructor
struct TempData2
{
    TempData2(double minimum, double maximum, double cur, int id, time_t t) :
       stationId{id}, timeSet{t}, current{cur}, maxTemp{maximum}, minTemp{minimum} {}
    int stationId;
    time_t timeSet;
    double current;
    double maxTemp;
    double minTemp;
};

int main()
{
    time_t time_to_set;

    // Member initialization (in order of declaration):
    TempData td{ 45978, time(&time_to_set), 28.9, 37.0, 16.7 };

    // When there's no constructor, an empty brace initializer does
    // value initialization = {0,0,0,0,0}
    TempData td_emptyInit{};

    // Uninitialized = if used, emits warning C4700 uninitialized local variable
    TempData td_noInit;

    // Member declaration (in order of ctor parameters)
    TempData2 td2{ 16.7, 37.0, 28.9, 45978, time(&time_to_set) };

    return 0;
}

class または struct にコンストラクターがない場合は、class でメンバーが宣言されている順序でリスト要素を指定します。 class にコンストラクターがある場合は、パラメーターの順序で要素を指定します。 型に暗黙的または明示的に宣言された既定のコンストラクターがある場合は、空の中かっこで中かっこの初期化を使用して呼び出すことができます。 たとえば、空の中かっこの初期化と空でない中かっこの初期化の両方を使用して、次 class のコードを初期化できます。

#include <string>
using namespace std;

class class_a {
public:
    class_a() {}
    class_a(string str) : m_string{ str } {}
    class_a(string str, double dbl) : m_string{ str }, m_double{ dbl } {}
double m_double;
string m_string;
};

int main()
{
    class_a c1{};
    class_a c1_1;

    class_a c2{ "ww" };
    class_a c2_1("xx");

    // order of parameters is the same as the constructor
    class_a c3{ "yy", 4.4 };
    class_a c3_1("zz", 5.5);
}

クラスに既定以外のコンストラクターがある場合、クラス メンバーがかっこ初期化に表示される順序は、対応するパラメーターがコンストラクターに表示される順序になります。メンバーが宣言される順序ではありません (前の例の class_a と同様)。 また、型に宣言されたコンストラクターがない場合は、宣言されている順序と同じ順序で、かっこ初期化子にメンバー初期化子を表示する必要があります。 この場合は、必要な数のパブリック メンバーを初期化できますが、メンバーをスキップすることはできません。 次の例は、宣言されたコンストラクターがないときに、かっこ初期化で使用される順序を示しています。

class class_d {
public:
    float m_float;
    string m_string;
    wchar_t m_char;
};

int main()
{
    class_d d1{};
    class_d d1{ 4.5 };
    class_d d2{ 4.5, "string" };
    class_d d3{ 4.5, "string", 'c' };

    class_d d4{ "string", 'c' }; // compiler error
    class_d d5{ "string", 'c', 2.0 }; // compiler error
}

既定のコンストラクターが明示的に宣言されていても、削除済みとしてマークされている場合、空の中かっこの初期化は使用できません。

class class_f {
public:
    class_f() = delete;
    class_f(string x): m_string { x } {}
    string m_string;
};
int main()
{
    class_f cf{ "hello" };
    class_f cf1{}; // compiler error C2280: attempting to reference a deleted function
}

かっこ初期化は、通常の初期化と同じように任意の場所で使用できます。たとえば、関数パラメーターや戻り値として、または new キーワードと共に使用できます。

class_d* cf = new class_d{4.5};
kr->add_d({ 4.5 });
return { 4.5 };

/std:c++17 モード以降では、空のかっこの初期化に関するルールが若干が厳しくなっています。 「派生コンストラクターと拡張集計の初期化」を参照してください。

initializer_list コンストラクター

initializer_list クラスは、他のコンテキストで、コンストラクターで使用できる指定した型のオブジェクトの一覧を表します。 かっこ初期化を使用して、initializer_list を構築できます。

initializer_list<int> int_list{5, 6, 7};

重要

このクラスを使用するには、<initializer_list> ヘッダーを追加する必要があります。

initializer_list をコピーできます。 この場合、新しいリストのメンバーは、元のリストのメンバーを参照します。

initializer_list<int> ilist1{ 5, 6, 7 };
initializer_list<int> ilist2( ilist1 );
if (ilist1.begin() == ilist2.begin())
    cout << "yes" << endl; // expect "yes"

標準ライブラリのコンテナー クラスと、stringwstring、および regex にも initializer_list コンストラクターが含まれます。 次の例は、これらのコンストラクターでかっこ初期化を行う方法を示しています。

vector<int> v1{ 9, 10, 11 };
map<int, string> m1{ {1, "a"}, {2, "b"} };
string s{ 'a', 'b', 'c' };
regex rgx{ 'x', 'y', 'z' };

関連項目

クラスと構造体
コンストラクター