c++11大括號初始化

N1ce2cu發表於2024-08-20

C++11可以將{}初始化器用於任何型別(可以用等號,也可以不用)

陣列、集合初始化

在C++11中,集合(列表)的初始化已經成為C++的一個基本功能,被稱為“初始化列表”:

// C++98支援,C++11支援
int a[] = {1, 2, 3};
// C++98不支援,C++11支援
int b[]{2, 3, 4};
// C++98不支援,C++11支援
vector<int> c{1, 2, 3};
// C++98不支援,C++11支援
map<int, float> d = {{1, 1.0f},
                     {2, 2.0f},
                     {3, 3.0f}};

在C++11中,自動變數和全域性變數的初始化方式包括:

// 1.等號加上賦值表示式
int t1 = 1 + 2;
// 2.等號加上大括號表示式的初始化列表
int t2 = {1 + 2};
// 3.大括號式的初始化列表
int t3{1 + 2};
int *t4 = new int{10};
// 4.小括號式的表示式列表
int t6(3 + 4);
int *t7 = new int(10);

類成員初始化

C++98中如果靜態成員不滿足常量性,不能就地宣告,且而且即使常量的靜態成員也只能是整型或列舉型才能就地初始化。

C++11中,除了初始化列表(在建構函式中初始化)外,允許使用等=或花括號{}進行就地的非靜態成員變數初始化:

struct Node {
    int value = 1;
};

如果在一個類中,既使用了就地初始化來初始化非靜態成員變數,又在建構函式中使用了初始化列表,執行順序是:先執行就地初始化,然後執行初始化列表。

自定義型別初始化

標準模板庫STL中容器對初始化列表的支援源於<initializer_list>標頭檔案中initialize_list類别範本的支援。程式設計師只要#include<initializer_list>並宣告一個以initialize_List模板類為引數的建構函式,也可以使得自定義類使用列表初始化。

相關文章