最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++11范圍for初始化列表auto decltype詳解

 更新時(shí)間:2025年07月28日 15:13:26   作者:QQ_437664314  
C++11引入auto類型推導(dǎo)、decltype類型推斷、統(tǒng)一列表初始化、范圍for循環(huán)及智能指針,提升代碼簡(jiǎn)潔性、類型安全與資源管理效率

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;

decltypeauto方便的一點(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、mapset 等)重載了 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ā)送功能

    C++實(shí)現(xiàn)含附件的郵件發(fā)送功能

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)含附件的郵件發(fā)送功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • C++ Clock類模擬實(shí)現(xiàn)鬧鐘運(yùn)行

    C++ Clock類模擬實(shí)現(xiàn)鬧鐘運(yùn)行

    這篇文章主要為大家詳細(xì)介紹了C++ Clock類模擬實(shí)現(xiàn)鬧鐘運(yùn)行,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++中的編譯與鏈接

    C++中的編譯與鏈接

    這篇文章主要介紹了C++中的編譯與鏈接,編譯型語(yǔ)言SHI?c++最大的優(yōu)點(diǎn),相比于Python這種解釋型語(yǔ)言,C++在編譯階段就進(jìn)行了許多處理,在執(zhí)行階段便具有高效性,下面我們就來(lái)詳細(xì)講解該內(nèi)容吧
    2021-12-12
  • OJ中G++和C++的區(qū)別

    OJ中G++和C++的區(qū)別

    今天小編就為大家分享一篇關(guān)于OJ中G++和C++的區(qū)別,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • Cocos2d-x中CCEditBox文本輸入框的使用實(shí)例

    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)頻率的解題思路

    這篇文章主要介紹了C語(yǔ)言統(tǒng)計(jì)輸入字符各個(gè)字母出現(xiàn)頻率的解題思路,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-08-08
  • C++ deque/queue/stack的底層原理解析

    C++ deque/queue/stack的底層原理解析

    這篇文章主要介紹了C++ deque/queue/stack的底層原理解析,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • C語(yǔ)言時(shí)間處理從基礎(chǔ)獲取到高級(jí)應(yīng)用總結(jié)大全

    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ù)

    這篇文章主要介紹了如何自定義sort函數(shù)中的比較函數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • C語(yǔ)言實(shí)現(xiàn)24點(diǎn)問(wèn)題詳解

    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

最新評(píng)論

甘洛县| 福安市| 新丰县| 泽普县| 姚安县| 融水| 佛学| 平定县| 巩留县| 南投市| 观塘区| 固镇县| 张北县| 天柱县| 云霄县| 科尔| 叙永县| 盐边县| 扬中市| 巴彦淖尔市| 石台县| 塘沽区| 昭通市| 罗田县| 临泉县| 清新县| 抚松县| 建水县| 山西省| 抚顺市| 柘荣县| 遂溪县| 廉江市| 雷波县| 雅安市| 晋宁县| 明水县| 灯塔市| 福海县| 巴青县| 洪江市|