C++11--このように初期化リストを遊ぶことができますか?
C++11には初期化リストが追加されていることがわかり、以前のブログでも紹介されていました.C++の初期化リスト(賦値と初期化を区別する)c++11特性のinitializer_listを浅く分析する
今日はこのように初期化リストを使うことについて議論します.
まずクラスを書きます.
このクラスを使用します.
出力:SimpleType::ctor,{1,1,"string"}
1簡潔2初期メンバー変数を忘れない3いくつかの構造関数がある場合、このように書くともっとメリットがあります.
上のクラスを簡単に変更できます.
変更されたクラスを使用するには、次の手順に従います.
次の操作を行います.
出力:
次の操作を行います.
出力:
副作用:vectorなど、空のメンバー変数がほしい場合.
今日はこのように初期化リストを使うことについて議論します.
まずクラスを書きます.
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など、空のメンバー変数がほしい場合.