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

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

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

C++11新特性

1. 自動類型推導(dǎo)auto

`在C++98中auto是一個存儲類型的說明符,表明變量是局部自動存儲類型,但是局部域中定義局部的變量默認(rèn)就是自動存儲類型,所以auto就沒什么價值了。

C++11中廢棄auto原來的用法,將其用于實現(xiàn)自動類型腿斷。這樣要求必須進(jìn)行顯示初始化,讓編譯器將定義對象的類型設(shè)置為初始化值的類型。

1.1 基本語法

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方便的一點是decltype無需顯式實例化,也就是單純定義也行decltype還可以作為模板參數(shù)傳遞,而auto不行。

3. 列表初始化

? 在 C++11 中,初始化列表(使用花括號 {})為內(nèi)置類型和自定義類型的初始化提供了統(tǒng)一、安全的語法。下面一一列舉。

  • 初始化列表 {} 是 C++11后 的推薦方式,提供類型安全語法統(tǒng)一性
  • 構(gòu)造函數(shù)初始化 () 保留傳統(tǒng)行為,但在某些場景(如 STL 容器)可能產(chǎn)生歧義。

3.1 內(nèi)置類型

int main(){
    int a{ 5 };     // 直接初始化
    int b = { 10 }; // 拷貝初始化
    char g{ 'A' };  // 正確,但不能超過char范圍

    int* ptr1{};   // 初始化為空指針
    int* ptr2{ &a }; // 指向變量a

    int arr1[]{ 1, 2, 3 };  // 自動推導(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;
}

其實就是當(dāng)內(nèi)置類型使用 { }初始化時,實際上是在調(diào)用它的構(gòu)造函數(shù)進(jìn)行構(gòu)造這就不奇怪了,無非就是讓內(nèi)置類型將 { } 也看做一種特殊的構(gòu)造:構(gòu)造+賦值 優(yōu)化為直接構(gòu)造我們可以通過一個簡單的Datw類來體現(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;
}

此時可以直接通過列表初始化{}初始化這個類。在C++11中允許省略=符號,編譯無報錯,使其與拷貝構(gòu)造函數(shù)一樣。使用關(guān)鍵字·explicit·可以避免編譯器隱式轉(zhuǎn)換。

這樣編譯器無法優(yōu)化,便無法對d1進(jìn)行構(gòu)造,自然無法完成賦值。d2相當(dāng)于直接拷貝構(gòu)造函數(shù)。

即對于內(nèi)置類型來說,列表初始化 { } 實際上就相當(dāng)于調(diào)用了內(nèi)置類型的構(gòu)造函數(shù),構(gòu)造出來一個對象。

3.2 自定義類型

C++11之前對于自定義類型初始化比較復(fù)雜,例如vector需要循環(huán)插入,在c++11時使用初始化列表對于自定義類型的數(shù)據(jù)操作更加方便。

3.2.1 初始化列表賦值底層

對于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>)

對于自定義類

如果類定義了 operator= 接受 std::initializer_list,則可以使用 {} 賦值:讓模擬實現(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;
        };
  • 同時提供普通構(gòu)造函數(shù)和 initializer_list 構(gòu)造函數(shù)時,注意優(yōu)先級差異。

4. 范圍 for

其為C++11引入的一種簡化容器遍歷的語法,它使遍歷序列容器(如數(shù)組、vector、list 等)變得更加簡潔直觀。

基本語法:

for (類型 變量名 : 目標(biāo)序列) {
    // 循環(huán)體
}

如果需要修改容器中的元素,需要使用引用,這樣能夠避免發(fā)生數(shù)據(jù)拷貝影響效率。同時使用const修飾能夠避免修改原始對象。

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

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

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

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

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

    C++中的編譯與鏈接

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

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

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

    Cocos2d-x中CCEditBox文本輸入框的使用實例

    這篇文章主要介紹了Cocos2d-x中CCEditBox文本輸入框的使用實例,本文在代碼中用大量注釋講解了CCEditBox的使用方法,需要的朋友可以參考下
    2014-09-09
  • C語言統(tǒng)計輸入字符各個字母出現(xiàn)頻率的解題思路

    C語言統(tǒng)計輸入字符各個字母出現(xiàn)頻率的解題思路

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

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

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

    C語言時間處理從基礎(chǔ)獲取到高級應(yīng)用總結(jié)大全

    在C語言編程中,是一個非常重要的標(biāo)準(zhǔn)庫,它提供了處理日期和時間的一系列函數(shù),這篇文章主要介紹了C語言時間處理從基礎(chǔ)獲取到高級應(yīng)用的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-08-08
  • 你知道如何自定義sort函數(shù)中的比較函數(shù)

    你知道如何自定義sort函數(shù)中的比較函數(shù)

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

    C語言實現(xiàn)24點問題詳解

    24點問題就是在屏幕上輸入1?10范圍內(nèi)的4個整數(shù)(可以有重復(fù)),對它們進(jìn)行加、減、乘、除四則運算后(可以任意的加括號限定計算的優(yōu)先級),尋找計算結(jié)果等于24的表達(dá)式。本文將通過C語言實現(xiàn)24點問題的求解,需要的可以參考一下
    2021-12-12

最新評論

曲阳县| 河北区| 青州市| 白河县| 安陆市| 晋中市| 郯城县| 福贡县| 甘洛县| 昆明市| 古丈县| 西乡县| 邢台市| 阿城市| 罗定市| 桑日县| 沈丘县| 拉萨市| 永城市| 洪雅县| 浦东新区| 定远县| 阿荣旗| 南投县| 囊谦县| 兰州市| 平乐县| 北票市| 大渡口区| 海林市| 孟连| 卓尼县| 兴安县| 库车县| 苏尼特左旗| 建始县| 正安县| 阿拉善左旗| 万山特区| 阿拉善右旗| 清镇市|