C++11范圍for初始化列表auto decltype詳解
C++11新特性
1. 自動(dòng)類型推導(dǎo)auto
`在C++98中auto是一個(gè)存儲(chǔ)類型的說(shuō)明符,表明變量是局部自動(dòng)存儲(chǔ)類型,但是局部域中定義局部的變量默認(rèn)就是自動(dòng)存儲(chǔ)類型,所以auto就沒(méi)什么價(jià)值了。
C++11中廢棄auto原來(lái)的用法,將其用于實(shí)現(xiàn)自動(dòng)類型腿斷。這樣要求必須進(jìn)行顯示初始化,讓編譯器將定義對(duì)象的類型設(shè)置為初始化值的類型。
1.1 基本語(yǔ)法
auto i = 42; // i 是 int
auto d = 3.14; // d 是 double
auto s = "hello"; // s 是 const char*
auto v = {1, 2, 3}; // v 是 std::initializer_list<int>
const auto ci = i; // const int
auto& ri = i; // int&
2. decltype
關(guān)鍵字decltype將變量的類型聲明為表達(dá)式指定的類型。
// decltype 可以推導(dǎo)出參數(shù)類型,并進(jìn)行傳遞 vector<decltype(it)>v1;
decltype比auto方便的一點(diǎn)是decltype無(wú)需顯式實(shí)例化,也就是單純定義也行decltype還可以作為模板參數(shù)傳遞,而auto不行。
3. 列表初始化
? 在 C++11 中,初始化列表(使用花括號(hào) {})為內(nèi)置類型和自定義類型的初始化提供了統(tǒng)一、安全的語(yǔ)法。下面一一列舉。
- 初始化列表 {} 是 C++11后 的推薦方式,提供類型安全和語(yǔ)法統(tǒng)一性。
- 構(gòu)造函數(shù)初始化 () 保留傳統(tǒng)行為,但在某些場(chǎng)景(如 STL 容器)可能產(chǎn)生歧義。
3.1 內(nèi)置類型
int main(){
int a{ 5 }; // 直接初始化
int b = { 10 }; // 拷貝初始化
char g{ 'A' }; // 正確,但不能超過(guò)char范圍
int* ptr1{}; // 初始化為空指針
int* ptr2{ &a }; // 指向變量a
int arr1[]{ 1, 2, 3 }; // 自動(dòng)推導(dǎo)大小
int arr2[5]{ 1, 2, 3 }; // 部分初始化,剩余元素為0
char str[]{ "Hello" }; // 字符數(shù)組
std::cout << "ptr1: " << ptr1 << "\n"
<< "ptr2: " << ptr2 << "\n"
<< "str: " << str << std::endl;
return 0;
}

其實(shí)就是當(dāng)內(nèi)置類型使用 { }初始化時(shí),實(shí)際上是在調(diào)用它的構(gòu)造函數(shù)進(jìn)行構(gòu)造這就不奇怪了,無(wú)非就是讓內(nèi)置類型將 { } 也看做一種特殊的構(gòu)造:構(gòu)造+賦值 優(yōu)化為直接構(gòu)造我們可以通過(guò)一個(gè)簡(jiǎn)單的Datw類來(lái)體現(xiàn)這一現(xiàn)象。
class Date {
public:
Date(int y,int m,int d):_year(y),_month(m),_day(d){}
private:
int _year;
int _month;
int _day;
};
int main(){
Date d1 = { 0,1,1 };
return 0;
}
此時(shí)可以直接通過(guò)列表初始化{}初始化這個(gè)類。在C++11中允許省略=符號(hào),編譯無(wú)報(bào)錯(cuò),使其與拷貝構(gòu)造函數(shù)一樣。使用關(guān)鍵字·explicit·可以避免編譯器隱式轉(zhuǎn)換。

這樣編譯器無(wú)法優(yōu)化,便無(wú)法對(duì)d1進(jìn)行構(gòu)造,自然無(wú)法完成賦值。d2相當(dāng)于直接拷貝構(gòu)造函數(shù)。
即對(duì)于內(nèi)置類型來(lái)說(shuō),列表初始化 { } 實(shí)際上就相當(dāng)于調(diào)用了內(nèi)置類型的構(gòu)造函數(shù),構(gòu)造出來(lái)一個(gè)對(duì)象。
3.2 自定義類型
C++11之前對(duì)于自定義類型初始化比較復(fù)雜,例如vector需要循環(huán)插入,在c++11時(shí)使用初始化列表對(duì)于自定義類型的數(shù)據(jù)操作更加方便。

3.2.1 初始化列表賦值底層
對(duì)于STL容器:
STL容器(如 vector、map、set 等)重載了 operator= 以支持 std::initializer_list,因此,可以直接用 {} 賦值:
std::vector<int>& operator=(std::initializer_list<int> il);
map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };
std::vector<int> v;
v = {1, 2, 3}; // 調(diào)用 operator=(initializer_list<int>)
對(duì)于自定義類
如果類定義了 operator= 接受 std::initializer_list,則可以使用 {} 賦值:讓模擬實(shí)現(xiàn)的vector也支持{}初始化和賦值…
template <class T>
class vector{
public:
typedef T *iterator;
vector(initializer_list<T> l){
_start = new T[l.size()];
_finish = _start + l.size();
_endofstorage = _start + l.size();
iterator vit = _start;
typename initializer_list<T>::iterator lit = l.begin();
while (lit != l.end()){
*vit++ = *lit++;
}
}
vector<T> &operator=(initializer_list<T> l){
vector<T> tmp(l);
std::swap(_start, tmp._start);
std::swap(_finish, tmp._finish);
std::swap(_endofstorage, tmp._endofstorage);
return *this;
}
private:
iterator _start;
iterator _finish;
iterator _endofstorage;
};
- 同時(shí)提供普通構(gòu)造函數(shù)和
initializer_list構(gòu)造函數(shù)時(shí),注意優(yōu)先級(jí)差異。
4. 范圍 for
其為C++11引入的一種簡(jiǎn)化容器遍歷的語(yǔ)法,它使遍歷序列容器(如數(shù)組、vector、list 等)變得更加簡(jiǎn)潔直觀。
基本語(yǔ)法:
for (類型 變量名 : 目標(biāo)序列) {
// 循環(huán)體
}
如果需要修改容器中的元素,需要使用引用,這樣能夠避免發(fā)生數(shù)據(jù)拷貝影響效率。同時(shí)使用const修飾能夠避免修改原始對(duì)象。
std::vector<std::string> words = {"aaaa", "bbbb", "cccc"};
for (const auto& word : words) {//使用 & 避免拷貝,使用const避免原始數(shù)據(jù)被修改
std::cout << word << " ";
}
// 輸出:aaaa bbbb cccc
5. 智能指針
bbb", “cccc”};
for (const auto& word : words) {//使用 & 避免拷貝,使用const避免原始數(shù)據(jù)被修改
std::cout << word << " ";
}
// 輸出:aaaa bbbb cccc總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++實(shí)現(xiàn)含附件的郵件發(fā)送功能
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)含附件的郵件發(fā)送功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
C++ Clock類模擬實(shí)現(xiàn)鬧鐘運(yùn)行
這篇文章主要為大家詳細(xì)介紹了C++ Clock類模擬實(shí)現(xiàn)鬧鐘運(yùn)行,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
Cocos2d-x中CCEditBox文本輸入框的使用實(shí)例
這篇文章主要介紹了Cocos2d-x中CCEditBox文本輸入框的使用實(shí)例,本文在代碼中用大量注釋講解了CCEditBox的使用方法,需要的朋友可以參考下2014-09-09
C語(yǔ)言統(tǒng)計(jì)輸入字符各個(gè)字母出現(xiàn)頻率的解題思路
這篇文章主要介紹了C語(yǔ)言統(tǒng)計(jì)輸入字符各個(gè)字母出現(xiàn)頻率的解題思路,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-08-08
C語(yǔ)言時(shí)間處理從基礎(chǔ)獲取到高級(jí)應(yīng)用總結(jié)大全
在C語(yǔ)言編程中,是一個(gè)非常重要的標(biāo)準(zhǔn)庫(kù),它提供了處理日期和時(shí)間的一系列函數(shù),這篇文章主要介紹了C語(yǔ)言時(shí)間處理從基礎(chǔ)獲取到高級(jí)應(yīng)用的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-08-08
你知道如何自定義sort函數(shù)中的比較函數(shù)
這篇文章主要介紹了如何自定義sort函數(shù)中的比較函數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
C語(yǔ)言實(shí)現(xiàn)24點(diǎn)問(wèn)題詳解
24點(diǎn)問(wèn)題就是在屏幕上輸入1?10范圍內(nèi)的4個(gè)整數(shù)(可以有重復(fù)),對(duì)它們進(jìn)行加、減、乘、除四則運(yùn)算后(可以任意的加括號(hào)限定計(jì)算的優(yōu)先級(jí)),尋找計(jì)算結(jié)果等于24的表達(dá)式。本文將通過(guò)C語(yǔ)言實(shí)現(xiàn)24點(diǎn)問(wèn)題的求解,需要的可以參考一下2021-12-12

