第7回は初期化リストです。 C++11では初期化リストの登場によりあらゆる初期化が{}で統一出来るようになりました。 1: #include <vector> 2: #include <iostream> 3: 4: using namespace std; 5: 6: struct Hoge 7: { 8: int arr[3]; 9: Hoge(int n, char* s) : arr{1, 2, 3}//配列メンバ変数の初期化も可能に 10: { 11: } 12: }; 13: 14: vector<int> create_Vec() 15: { 16: return{ 1, 2, 3 };//戻り値としてもOK 17: } 18: 19: int sum(vector<int> vec) 20: { 21: int sum = 0; 22: for (auto i : vec) 23: { 24: sum += i; 25: } 26: 27: return sum; 28: } 29: 30: int main() 31: { 32: Hoge hoge1(1, "Hello");//従来 33: 34: Hoge hoge2{2, "Hello"};//これでも可能に 35: Hoge hoge3 = {2, "Hello" };//これもOK 36: 37: vector<int> vec1{0, 1, 2, 3, 4};//コンテナの初期化も出来るように 38: vector<int> vec2 = {0, 1, 2, 3, 4};//もちろんこれもOK 39: vector<int> vec3 = create_Vec(); 40: 41: //引数もOK 42: cout << sum({1, 2, 3, 4, 5}) << endl; 43: 44: return 0; 45: } これによる記述の統一が出来て綺麗になります。 1: #include <initializer_list> 2: 3: using namespace std; 4: 5: class Hoge 6: { 7: public: 8: Hoge(initializer_list<int> list) {} 9: }; 10: 11: int main() 12: { 13: //{}での初期化が可能に! 14: Hoge hoge1{ 1, 2, 3, 4, 5 }; 15: Hoge hoge2 = { 1, 2, 3 }; 16: 17: return 0; 18: } また、インスタンス生成でデフォルトコンストラクタを()で呼ぶ時の曖昧さを回避することができます。 1: struct Hoge 2: { 3: }; 4: 5: int main() 6: { 7: Hoge hoge1();//関数宣言? 8: Hoge hoge2{};//これなら曖昧にならない! 9: 10: return 0; 11: } 初期化リストが出たことにより、文法の統一やコンテナの初期化が簡易に行えるようになりました。 以上で初期化リストの説明を終わります。 |