C++的初始化列表和列表初始化
初始化列表
初始化列表是聲明在構(gòu)造函數(shù)中來實(shí)現(xiàn)的,相當(dāng)于初始化东亦,而不是復(fù)制操作
初始化列表示例
class Test_A{
public:
Test_A(): a(0) {
}
private:
int a;
};
??如代碼中,跟隨在構(gòu)造函數(shù)聲明冒號(hào)后的即是
初始化列表的好處
初始化列表是由其必要性的唬渗,比如
const
變量典阵、引用、禁止復(fù)制構(gòu)造函數(shù)的類镊逝、沒有默認(rèn)構(gòu)造函數(shù)的類
- 避免調(diào)用多次構(gòu)造函數(shù)
列表初始化
C語言中直接使用
{}
定義且賦值的操作其實(shí)就可以稱之為列表初始化
對(duì)象初始化
對(duì)象初始化比較復(fù)雜壮啊,涉及到很多的構(gòu)造函數(shù);這里只關(guān)注于使用列表這樣的初始化方式
struct Test_ST_A {
int num;
char *ptr;
float fnum;
};
class Test_Class_A {
public:
//virtual ~Test_Class_A() {};
//Test_Class_A() {};
int num;
char *ptr;
float fnum;
private:
//Test_Class_A(const Test_Class_A &) {};
};
int main() {
Test_ST_A st_a = { 0, NULL, 1.1};
Test_Class_A cla_a = { 0, NULL, 1.1};
return 0;
}
??在C++中是可以直接使用{}
包含多個(gè)參數(shù)直接對(duì)內(nèi)部數(shù)據(jù)進(jìn)行初始化的蹋半,并且這些參數(shù)的類型是可以不一致的他巨;同時(shí)如果定義了構(gòu)造函數(shù)充坑、虛函數(shù)之類的則無法再這樣初始化了减江,必須定義符合一致的Test_Class_A(int, const char* , float) {};
構(gòu)造函數(shù)方可。這就是列表初始化捻爷,調(diào)用的是構(gòu)造函數(shù)喲
initializer_list
這個(gè)類主要是針對(duì)于容器來的辈灼,對(duì)于容器來說也應(yīng)當(dāng)想C語言中數(shù)組一樣提供類似的初始化、賦值函數(shù)
int main() {
std::vector<int> v = {1, 2, 3};
return 0;
}
??這里可以當(dāng)作簡(jiǎn)單的語法糖也榄,但是當(dāng)我們期望傳入一個(gè){}(<brace-enclosed initializer list>)
來初始化一個(gè)類內(nèi)部的vector
該如何呢巡莹?
class Test_Class_A {
public:
//virtual ~Test_Class_A() {};
Test_Class_A(std::initializer_list<int> l): data(l) {
};
std::vector<int> data;
};
int main() {
Test_Class_A tca = { 1, 2, 3};
return 0;
}
??寫到這里司志,感覺到C++
這樣的語言期望能實(shí)現(xiàn)很多非常優(yōu)良的特性,很多時(shí)候?yàn)榱四骋粋€(gè)點(diǎn)就需要引入一個(gè)新的概念降宅,比如remove_reference
骂远、initializer_list
、左值引用腰根;和C
語言的"精簡(jiǎn)"已經(jīng)漸行漸遠(yuǎn)了