- 追加された行はこの色です。
- 削除された行はこの色です。
第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: }
これによる記述の統一が出来て綺麗になります。
ユーザー定義のクラスに初期化リストを使用する場合はinitializer_listを受けとるコンストラクタや代入演算子を定義すれば可能になります。
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: }
初期化リストが出たことにより、文法の統一やコンテナの初期化が簡易に行えるようになりました。
文法として出来ることが増えるのがメインの機能なので使うのはそこまで難しくないと思います。
以上で初期化リストの説明を終わります。
前→C++11講座6回
次→C++11講座8回
#vote(世界のC++[0],これマジ?[0],ムズすぎィ![0])