欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文詳解C++關(guān)鍵詞auto的用法

 更新時(shí)間:2024年02月02日 09:25:51   作者:顧得泉  
在早期C/C++中auto的含義是:使用auto修飾的變量,是具有自動(dòng)存儲(chǔ)器的局部變量,但遺憾的是一直沒(méi)有人去使用它,在 C++11中,auto不再是一個(gè)存儲(chǔ)類型指示符,而是作為一個(gè)新的類型指示符來(lái)指示編譯器,本文將給大家詳細(xì)的介紹一下C++關(guān)鍵詞auto的用法,需要的朋友可以參考下

一、小思考       

隨著我們對(duì)于C++的不斷學(xué)習(xí),遇到的程序越來(lái)越復(fù)雜,程序中用到的類型也越來(lái)越復(fù)雜,經(jīng)常體現(xiàn)在:

1.類型難于拼寫

2.含義不明確導(dǎo)致容易出錯(cuò)

舉個(gè)栗子來(lái)說(shuō):

#include <string>
#include <map>
int main()
{
     std::map<std::string, std::string> m{ { "apple", "蘋果" }, { "orange", "橙子" },{"pear","梨"} };
     std::map<std::string, std::string>::iterator it = m.begin();
     while (it != m.end())
     {
     //....
     }
     return 0;
}

std::map<std::string, std::string>::iterator 是一個(gè)類型,但是該類型太長(zhǎng)了,特別容易寫錯(cuò)。         聰明的同學(xué)可能已經(jīng)想到:可以通過(guò)typedef給類型取別名,比如:

#include <string>
#include <map>
typedef std::map<std::string, std::string> Map;
int main()
{
     Map m{ { "apple", "蘋果" },{ "orange", "橙子" }, {"pear","梨"} };
     Map::iterator it = m.begin();
     while (it != m.end())
     {
         //....
     }
     return 0;
}

使用typedef給類型取別名確實(shí)可以簡(jiǎn)化代碼,但是typedef有會(huì)遇到新的難題:

typedef char* pstring;
int main()
{
 const pstring p1;    // 編譯成功還是失?。?
 const pstring* p2;   // 編譯成功還是失???
 return 0;
}

在編程時(shí),常常需要把表達(dá)式的值賦值給變量,這就要求在聲明變量的時(shí)候清楚地知道表達(dá)式的類型。然而有時(shí)候要做到這點(diǎn)并非那么容易,因此C++11給auto賦予了新的含義。

二、auto簡(jiǎn)介

在早期C/C++中auto的含義是:使用auto修飾的變量,是具有自動(dòng)存儲(chǔ)器的局部變量,但遺憾的是一直沒(méi)有人去使用它,大家可思考下為什么?

C++11中,標(biāo)準(zhǔn)委員會(huì)賦予了auto全新的含義即:auto不再是一個(gè)存儲(chǔ)類型指示符,而是作為一個(gè)新的類型指示符來(lái)指示編譯器,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;
    //auto e; 無(wú)法通過(guò)編譯,使用auto定義變量時(shí)必須對(duì)其進(jìn)行初始化
    return 0;
}

由上圖可知,auto會(huì)自動(dòng)給變量定義類型。

注意:

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

三、auto使用規(guī)則

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

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

int main()
{
    int x = 10;
    auto a = &x;
    auto* b = &x;
    auto& c = x;
    cout << typeid(a).name() << endl;
    cout << typeid(b).name() << endl;
    cout << typeid(c).name() << endl;
    *a = 20;
    *b = 30;
     c = 40;
    return 0;
}

如圖所示: 

不加&的情況,大家可以自行練習(xí)。如果不加&,不會(huì)引用成功。

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

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

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

四、auto不能推導(dǎo)的場(chǎng)景

1.auto不能作為函數(shù)的參數(shù)

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

2. auto不能直接用來(lái)聲明數(shù)組

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

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

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

五、基于范圍的for循環(huán)(附帶內(nèi)容)

1.范圍for的語(yǔ)法

在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;
}

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

void TestFor()
{
    int array[] = { 1, 2, 3, 4, 5 };
    for(auto& e : array)
         e *= 2;
    for(auto e : array)
         cout << e << " ";
    return 0;
}

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

2.范圍for的使用條件

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

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

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

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

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

總結(jié)

到此這篇關(guān)于一文詳解C++關(guān)鍵詞auto的用法的文章就介紹到這了,更多相關(guān)C++關(guān)鍵詞auto內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ 匈牙利算法案例分析詳解

    C++ 匈牙利算法案例分析詳解

    這篇文章主要介紹了C++ 匈牙利算法案例分析詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C/C++合并兩個(gè)升序鏈表的方式

    C/C++合并兩個(gè)升序鏈表的方式

    這篇文章主要介紹了C/C++合并兩個(gè)升序鏈表的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C語(yǔ)言中的pause()函數(shù)和alarm()函數(shù)以及sleep()函數(shù)

    C語(yǔ)言中的pause()函數(shù)和alarm()函數(shù)以及sleep()函數(shù)

    這篇文章主要介紹了C語(yǔ)言中的pause()函數(shù)和alarm()函數(shù)以及sleep()函數(shù),是C語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C語(yǔ)言?auto和register關(guān)鍵字

    C語(yǔ)言?auto和register關(guān)鍵字

    這篇文章主要介紹了C語(yǔ)言?auto、register關(guān)鍵字,文章通過(guò)變量展開(kāi)全文相關(guān)的詳細(xì)內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-04-04
  • C++中std::priority_queue的使用小結(jié)

    C++中std::priority_queue的使用小結(jié)

    std::priority_queue是C++ STL提供的優(yōu)先隊(duì)列,本文主要介紹了C++中std::priority_queue的使用小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04
  • C++多繼承同名隱藏實(shí)例詳細(xì)介紹

    C++多繼承同名隱藏實(shí)例詳細(xì)介紹

    多繼承可以看作是單繼承的擴(kuò)展。所謂多繼承是指派生類具有多個(gè)基類,派生類..本文將對(duì)C++多繼承同名隱藏實(shí)例進(jìn)行分析
    2012-11-11
  • C語(yǔ)言利用UDP實(shí)現(xiàn)群聊聊天室的示例代碼

    C語(yǔ)言利用UDP實(shí)現(xiàn)群聊聊天室的示例代碼

    UDP是一個(gè)輕量級(jí)、不可靠、面向數(shù)據(jù)報(bào)的、無(wú)連接的傳輸層協(xié)議,多用于可靠性要求不嚴(yán)格,不是非常重要的傳輸,如直播、視頻會(huì)議等等。本文將利用UDP實(shí)現(xiàn)簡(jiǎn)單的群聊聊天室,感興趣的可以了解一下
    2022-08-08
  • C++之多態(tài)(內(nèi)容不錯(cuò))

    C++之多態(tài)(內(nèi)容不錯(cuò))

    什么是多態(tài)?顧名思義就是同一個(gè)事物在不同場(chǎng)景下的多種形態(tài),需要的朋友可以參考下
    2020-01-01
  • libevent庫(kù)的使用方法實(shí)例

    libevent庫(kù)的使用方法實(shí)例

    這篇文章主要介紹了libevent庫(kù)的使用方法實(shí)例,有需要的朋友可以參考一下
    2013-12-12
  • C語(yǔ)言 遞歸實(shí)現(xiàn)排雷游戲

    C語(yǔ)言 遞歸實(shí)現(xiàn)排雷游戲

    掃雷是電腦上很經(jīng)典很經(jīng)典的傳統(tǒng)老游戲,從小編第一次摸到計(jì)算機(jī)開(kāi)始就玩過(guò)掃雷,雖然當(dāng)時(shí)并不理解玩法原理,但終是第一次玩電腦游戲,下面來(lái)從掃雷的前世今生講起
    2021-11-11

最新評(píng)論