c++11中,集合(列表)的初始化已經成為c++語言的乙個基本功能,這種初始化的方法被稱為「初始化列表」(initializer list),例如:
#include
#include
using
namespace std;
int a=
;int b;
vector<
int> c
;map<
int,
float
> d =,,
};
這樣一來,自動變數和全域性變數的初始化在c++11中被豐富了,程式設計師可以使用以下幾種形式完成初始化的工作 :
後面2種形式也可以用於獲取堆記憶體new操作符中,比如:
int
* i =
newint(1
);double
* d =
newdouble
;
自定義的類如果要使用初始化列表初始化,需要#include
標頭檔案,並且宣告乙個以initializer_list模板類為引數的建構函式:
#include
#include
using
namespace std;
enum gender
;class
people
private
: vector> data;};
people ship2012 =,}
;
同樣的,函式的引數列表也可以使用初始化列表:
#include
using
namespace std;
void
fun(initializer_list<
int> iv)
intmain()
);fun();
// 空列表
}
可有接收任意個數的初始化值
void
print
(std::initializer_list<
int> vals)
}print()
;// pass a list of values to print()
列表初始化語法對於stl容器和自定義類作用很大(尤其是一些測試**),但對於陣列等型別就沒必要強制使用了。總的來說,這是乙個能在部分場景下大大提高效率的值得推廣的特性。
int i
;int i =
;int i =0;
inti(0
);float f
;float f =
;float f =
3.6;
floatf(
3.6)
;char charr=
;char charr;
char
* c =
newchar
;char
* c =
newchar
(`g`)
;
char charr;
char charr=
;
std::vector<
int> v =
;std::vector<
int> v
;std::pair<
int, std::string> p =
;
2.4.1 函式引數
大括號表示式做實參傳入時,會構造乙個initializer_list
物件。
#include
#include
void
displayint
(const std::initializer_list<
int>
& ivec)
}int
main()
);return0;
}
2.4.2 函式的返回值在c++03中對類的成員變數初始化有兩種方式:
一般前者效率會更高。
在c++11中為了避免當內部成員變數較多時,初始化列表顯得冗長,開始支援在成員變數中宣告時,直接對其進行賦值操作或者初始化列表。
class
test
private
:int value =0;
std::string name ;}
;
其執行的順序為:
直接賦值操作
初始化列表
建構函式內部初始化
其三者可以同時使用,不衝突。
注意:c++11 中不支援在類內部用小括號進行直接賦值操作。
C 11 就地初始化與列表初始化
在 c 11 之前,只能對結構體或類的靜態常量成員進行就地初始化,其他的不行。class c class c or int b c 11 only int c 7 error 注意,小括號初始化方式不能用於就地初始化。c 11 支援了就地初始化非靜態資料成員的同時,初始化列表的方式也被保留下來,也就...
c 11 就地初始化與列表初始化
還可以看看 在c 11之前,只能對結構體或類的靜態常量成員進行就地初始化,其他的不行。class c class c 或int b c 11 only int c 7 error 1.2就地初始化與初始化列表的先後順序 c 11標準支援了就地初始化非靜態資料成員的同時,初始化列表的方式也被保留下來,...
C 11之列表初始化
c 98使用 對陣列初始化 int arr int arr 4 但對於自定義型別會報錯 vectorv 內建型別 int x1 int x2 int x3 1 2 int x4 int x5 陣列 int arr1 5 int arr2 動態陣列 c 98不支援 int arr3 new int 5...