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

C++超詳細(xì)講解auto與nullptr的使用

 更新時(shí)間:2022年05月16日 15:04:18   作者:Hiland.  
C++11提供了nullptr用來取代0或者NULL。在C++11之前,使用NULL為空指針賦初值,但NULL其實(shí)就是0,這時(shí)會把NULL當(dāng)成0來用;在C++11中,我們在聲明一個(gè)變量或?qū)ο?,指定它的類型時(shí),可以不使用變量本身的類型而使用auto替代

一. auto關(guān)鍵字

1. auto介紹

在早期C/C++中auto的含義是:使用auto修飾的變量,是具有自動存儲器的局部變量。

但是在C++11開始,賦予了auto全新的含義即:auto不再是一個(gè)存儲類型指示符,而是作為一個(gè)新的類型指示符來指示編譯器,auto聲明的變量必須由編譯器在編譯時(shí)期推導(dǎo)而得。

int TestAuto()
{
     return 10;
}
int main()
{
     int a = 10;
     auto b = a;
     auto c = 'a';
     auto d = TestAuto();
     //打印類型
     cout << typeid(b).name() << endl;
     cout << typeid(c).name() << endl;
     cout << typeid(d).name() << endl;
     return 0;
}

注意:

使用auto定義變量時(shí)必須對其進(jìn)行初始化,在編譯階段編譯器需要根據(jù)初始化表達(dá)式來推導(dǎo)auto的實(shí)際類型。因此auto并非是一種“類型”的聲明,而是一個(gè)類型聲明時(shí)的“占位符”,編譯器在編譯期會將auto替換為變量實(shí)際的類型(自定義類型也可以)。

auto a; 無法通過編譯,使用auto定義變量時(shí)必須對其進(jìn)行初始化

2. 使用規(guī)則

(1)auto與指針和引用結(jié)合起來使用

用auto聲明指針類型時(shí),用auto和auto*沒有任何區(qū)別,但用auto聲明引用類型時(shí)則必須加&

int main()
{
     int x = 10;
     const int y = 20;
     //推斷沒有帶解引用操作符的整形指針
     auto a = &x;
     auto a2 = &y;
     //推斷帶解引用操作符的整形指針
     auto* b = &x;
     //auto* b = x;//注意別寫成這樣,左邊推導(dǎo)一定是指針,x是整形,這樣是會報(bào)錯(cuò)的
     auto* b2 = &y;
     //推斷引用類型
     auto& c = x;
     auto& c2 = y;
     //打印類型
     cout << typeid(a).name() << endl;
     cout << typeid(b).name() << endl;
     cout << typeid(c).name() << endl;
     cout << typeid(a2).name() << endl;
     cout << typeid(b2).name() << endl;
     cout << typeid(c2).name() << endl;
     return 0;
}    

這里發(fā)現(xiàn)了一個(gè)問題,我們用const修飾了y,但是推導(dǎo)出來的引用類型居然沒有被const修飾,但是我們在寫代碼的時(shí)候不加const編譯器一定會報(bào)錯(cuò),要注意這里的這個(gè)問題

(2)在同一行定義多個(gè)變量

當(dāng)在同一行聲明多個(gè)變量時(shí),這些變量必須是相同的類型,否則編譯器將會報(bào)錯(cuò),因?yàn)榫幾g器實(shí)際只對第一個(gè)類型進(jìn)行推導(dǎo),然后用推導(dǎo)出來的類型定義其他變量。

void TestAuto()
{
     auto a = 1, b = 2; 
     auto c = 3, d = 4.0; // 該行代碼會編譯失敗,因?yàn)閏和d的初始化表達(dá)式類型不同
}

3. auto不能推導(dǎo)的場景

auto不能作為函數(shù)的參數(shù)和返回值

// 此處代碼編譯失敗,auto不能作為形參類型,因?yàn)榫幾g器無法對a的實(shí)際類型進(jìn)行推導(dǎo)
void TestAuto(auto a)
{}
//不然接收和傳參不知道怎么傳參和接收
auto TestAuto(int a)
{}

auto不能直接用來聲明數(shù)組

void TestAuto()
{
     int a[] = {1,2,3};
     auto b[] = {4,5,6};
}

為了避免與C++98中的auto發(fā)生混淆,C++11只保留了auto作為類型指示符的用法

auto在實(shí)際中最常見的優(yōu)勢用法就是跟以后會講到的C++11提供的新式for循環(huán),還有l(wèi)ambda表達(dá)式等進(jìn)行配合使用。

二. 基于范圍的for循環(huán)(C++11)

1. 范圍for的語法

在C++98中如果要遍歷一個(gè)數(shù)組,可以按照以下方式進(jìn)行:

void TestFor()
{
     int array[] = { 1, 2, 3, 4, 5 };
     for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
     array[i] *= 2;
     for (int* p = array; p < array + sizeof(array)/ sizeof(array[0]); ++p)
     cout << *p << endl;
}

對于一個(gè)有范圍的集合而言,由程序員來說明循環(huán)的范圍是多余的,有時(shí)候還會容易犯錯(cuò)誤。因此C++11中引入了基于范圍的for循環(huán)。for循環(huán)后的括號由冒號“ :”分為兩部分:第一部分是范圍內(nèi)用于迭代的變量, 第二部分則表示被迭代的范圍。

void TestFor()
{
     //依次自動取array中的數(shù)據(jù)賦值給e,自動判斷結(jié)束
     int array[] = { 1, 2, 3, 4, 5 };
     for(auto& e : array)
     e *= 2; 
     for(auto e : array)
     cout << e << " ";
}

注意:與普通循環(huán)類似,可以用continue來結(jié)束本次循環(huán),也可以用break來跳出整個(gè)循環(huán)。

2. 范圍for的使用條件

(1)for循環(huán)迭代的范圍必須是確定的

對于數(shù)組而言,就是數(shù)組中第一個(gè)元素和最后一個(gè)元素的范圍;對于類而言,應(yīng)該提供begin和end的方法,begin和end就是for循環(huán)迭代的范圍。

以下代碼就有問題,因?yàn)閒or的范圍不確定:

(數(shù)組傳參,數(shù)組會退化成指針,所以這里接受的是指針,就導(dǎo)致了范圍是不確定的)

void TestFor(int array[])
{
     for(auto& e : array)
     cout<< e <<endl;
}

(2)迭代的對象要實(shí)現(xiàn)++和==的操作

三. 指針空值nullptr(C++11)

C++98中的指針空值,在C/C++中,聲明一個(gè)變量時(shí)最好給該變量一個(gè)合適的初始值,否則可能會出現(xiàn)不可預(yù)料的錯(cuò)誤,比如未初始化的指針。如果一個(gè)指針沒有合法的指向,我們基本都是按照如下方式對其進(jìn)行初始化:

void TestPtr()
{
     int* p1 = NULL;
     int* p2 = 0;
}

但是,這里的NULL實(shí)際是一個(gè)宏,在傳統(tǒng)的C頭文件(stddef.h)中,可以看到如下代碼:

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

可以看到,NULL可能被定義為字面常量0,或者被定義為無類型指針(void*)的常量。但是不論采取何種定義,在使用空值的指針時(shí),都不可避免的會遇到一些麻煩,比如:

void fun(int)
{
     cout<<"fun(int)"<<endl;
}
void fun(int*)
{
     cout<<"fun(int*)"<<endl;
}
int main()
{
     fun(0);
     fun(NULL);
     fun((int*)NULL);
     return 0;
}

程序本意是想通過fun(NULL)調(diào)用指針版本的fun(int*)函數(shù),但是由于NULL被定義成0,因此與程序的初衷相悖。 在C++98中,字面常量0既可以是一個(gè)整形數(shù)字,也可以是無類型的指針(void*)常量,但是編譯器默認(rèn)情況下將其看成是一個(gè)整形常量,如果要將其按照指針方式來使用,必須對其進(jìn)行強(qiáng)轉(zhuǎn)(void *)0。

注意:

  • 在使用nullptr表示指針空值時(shí),不需要包含頭文件,因?yàn)閚ullptr是C++11作為新關(guān)鍵字引入的。
  • 在C++11中,sizeof(nullptr) 與 sizeof((void*)0)所占的字節(jié)數(shù)相同。
  • 為了提高代碼的健壯性,在后續(xù)表示指針空值時(shí)建議最好使用nullptr。

到此這篇關(guān)于C++超詳細(xì)啊境界auto與nullptr的使用的文章就介紹到這了,更多相關(guān)C++ auto與nullptr內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++類與對象及構(gòu)造函數(shù)析構(gòu)函數(shù)基礎(chǔ)詳解

    C++類與對象及構(gòu)造函數(shù)析構(gòu)函數(shù)基礎(chǔ)詳解

    這篇文章主要為大家介紹了C++類與對象及構(gòu)造函數(shù)析構(gòu)函數(shù)基礎(chǔ)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • C語言中qsort函數(shù)的介紹與用法實(shí)例

    C語言中qsort函數(shù)的介紹與用法實(shí)例

    C語言的標(biāo)準(zhǔn)庫提供了一個(gè)重要的排序函數(shù)qsort給C語言使用者使用,qsort函數(shù)將快速排序的算法封裝起來,這篇文章主要給大家介紹了關(guān)于C語言中qsort函數(shù)的介紹與用法的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • Qt數(shù)據(jù)庫應(yīng)用之實(shí)現(xiàn)通用數(shù)據(jù)庫采集

    Qt數(shù)據(jù)庫應(yīng)用之實(shí)現(xiàn)通用數(shù)據(jù)庫采集

    這篇文章主要為大家介紹了Qt中是如何實(shí)現(xiàn)通用數(shù)據(jù)庫采集的,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Qt有一定幫助,感興趣的小伙伴可以了解一下
    2022-03-03
  • C++貪心算法處理多機(jī)調(diào)度問題詳解

    C++貪心算法處理多機(jī)調(diào)度問題詳解

    貪心算法(又稱貪婪算法)是指,在對問題求解時(shí),總是做出在當(dāng)前看來是最好的選擇。也就是說,不從整體最優(yōu)上加以考慮,他所做出的僅是在某種意義上的局部最優(yōu)解
    2022-06-06
  • C語言內(nèi)存函數(shù)的具體使用

    C語言內(nèi)存函數(shù)的具體使用

    本文介紹了C語言中幾個(gè)常用的內(nèi)存函數(shù),包括memcpy、memmove、memset、memcmp的使用方法及其模擬實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • Qt中QUndoView控件的具體使用

    Qt中QUndoView控件的具體使用

    QUndoView是Qt框架中用于可視化顯示QUndoStack內(nèi)容的控件,本文主要介紹了Qt中QUndoView控件的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04
  • OpenCV計(jì)算圖像的水平和垂直積分投影

    OpenCV計(jì)算圖像的水平和垂直積分投影

    這篇文章主要為大家詳細(xì)介紹了OpenCV計(jì)算圖像的水平和垂直積分投影,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 老生常談C++ 中的繼承

    老生常談C++ 中的繼承

    這篇文章主要介紹了C++ 中的繼承,本文通過實(shí)例代碼給大家介紹的非常詳細(xì)對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • C++中.inc文件的具體使用

    C++中.inc文件的具體使用

    在C++ 中,.inc文件通常是指包含文件,但它們的使用場景與?.h(頭文件)略有不同,不聲明接口,常用于模塊化、條件編譯及跨文件復(fù)用,下面就來介紹一下
    2025-06-06
  • C++?primer超詳細(xì)講解關(guān)聯(lián)容器

    C++?primer超詳細(xì)講解關(guān)聯(lián)容器

    兩個(gè)主要的關(guān)聯(lián)容器為map和set,map中元素是一些關(guān)鍵字—值對,關(guān)鍵字起索引的作用,值則表示與索引相關(guān)聯(lián)的數(shù)據(jù)。set中每個(gè)元素只包含一個(gè)關(guān)鍵字,set支持高效的關(guān)鍵字查詢操作——檢查一個(gè)給定關(guān)鍵字是否在set中
    2022-07-07

最新評論

闻喜县| 阿尔山市| 宣武区| 弥勒县| 五大连池市| 西藏| 东乌珠穆沁旗| 河东区| 萝北县| 左权县| 连云港市| 静宁县| 凤阳县| 邵武市| 鄂州市| 西安市| 恭城| 宝清县| 阳信县| 富蕴县| 花莲市| 施甸县| 南宫市| 拉孜县| 宝兴县| 长寿区| 新邵县| 衡水市| 襄城县| 积石山| 乐清市| 巴彦淖尔市| 黄平县| 江西省| 鲜城| 北海市| 玛纳斯县| 阳信县| 丰顺县| 出国| 嘉祥县|