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

C++11新特性中auto 和 decltype 區(qū)別和聯(lián)系

 更新時(shí)間:2017年01月20日 11:43:53   投稿:lqh  
這篇文章主要介紹了C++11新特性中auto 和 decltype 區(qū)別和聯(lián)系的相關(guān)資料,需要的朋友可以參考下

C++11新特性中auto 和 decltype 區(qū)別和聯(lián)系

一. auto簡(jiǎn)介

編程時(shí)候常常需要把表達(dá)式的值付給變量,需要在聲明變量的時(shí)候清楚的知道變量是什么類(lèi)型。然而做到這一點(diǎn)并非那么容易(特別是模板中),有時(shí)候根本做不到。為了解決這個(gè)問(wèn)題,C++11新標(biāo)準(zhǔn)就引入了auto類(lèi)型說(shuō)明符,用它就能讓編譯器替我們?nèi)シ治霰磉_(dá)式所屬的類(lèi)型。和原來(lái)那些只對(duì)應(yīng)某種特定的類(lèi)型說(shuō)明符(例如 int)不同。auto 讓編譯器通過(guò)初始值來(lái)進(jìn)行類(lèi)型推演。從而獲得定義變量的類(lèi)型,所以說(shuō) auto 定義的變量必須有初始值。

//由val_1 和val_2相加的結(jié)果可以推斷出item的類(lèi)型 
auto item = val_1 + val_2;//item 類(lèi)型初始化為val_1 + val_2相加后的類(lèi)型,值為val_1+val_2相加的值。 

    這里的 item 的類(lèi)型是編譯器在編譯的過(guò)程中通過(guò)val_1和val_2的類(lèi)型相加后推算出來(lái)的。假如是val_1(int) + val_2(double),那么item的類(lèi)型就是double.

            使用auto也能在一個(gè)語(yǔ)句中聲明多個(gè)變量,因?yàn)橐粋€(gè)聲明雨具只能有一個(gè)基本數(shù)據(jù)類(lèi)型,所以該雨具所有變量的初始基本數(shù)據(jù)類(lèi)型都必須是一樣的。在這里一定要區(qū)別數(shù)據(jù)類(lèi)型和類(lèi)型修飾符??!

int i = 3; 
auto a = i,&b = i,*c = &i;//正確: a初始化為i的副本,b初始化為i的引用,c為i的指針. 
auto sz = 0, pi = 3.14;//錯(cuò)誤,兩個(gè)變量的類(lèi)型不一樣。 

            編譯器推斷出來(lái)的auto類(lèi)型有時(shí)候會(huì)跟初始值的類(lèi)型并不完全一樣,編譯器會(huì)適當(dāng)?shù)母淖兘Y(jié)果類(lèi)型使得其更符合初始化規(guī)則。

            首先,正如我們熟知的,使用引用其實(shí)是使用引用的對(duì)象,特別當(dāng)引用被用作初始值的時(shí)候,真正參與初始化的其實(shí)是引用對(duì)象的值。此時(shí)編譯器以引用對(duì)象的類(lèi)型作為auto的類(lèi)型:

int i = 0 ,&r = i;//定義一個(gè)整數(shù)i,并且定義r為i的應(yīng)用. 
auto a = r; //這里的a為為一個(gè)整數(shù),其值跟此時(shí)的i一樣. 

            由此可以看出auto會(huì)忽略引用,其次,auto一般會(huì)忽略掉頂層const,但底層const會(huì)被保留下來(lái),比如當(dāng)初始值是一個(gè)指向常量的指針時(shí):

int i = 0; 
const int ci = i, &cr = ci; //ci 為整數(shù)常量,cr 為整數(shù)常量引用  
auto a = ci;   // a 為一個(gè)整數(shù), 頂層const被忽略 
auto b = cr;   // b 為一個(gè)整數(shù),頂層const被忽略 
auto c = &ci;  // c 為一個(gè)整數(shù)指針. 
auto d = &cr;  // d 為一個(gè)指向整數(shù)常量的指針(對(duì)常量對(duì)象區(qū)地址是那么const會(huì)變成底層const) 

            如果你希望推斷出auto類(lèi)型是一個(gè)頂層的const,需要明確指出:

const auto f = ci; 

            還可以將引用的類(lèi)型設(shè)為auto,此時(shí)原來(lái)的初始化規(guī)則仍然適用(用于引用聲明的const都是底層const):

auto &g = ci; //g是一個(gè)整數(shù)常量引用,綁定到ci。 
auto &h = 42; // 錯(cuò)誤:非常量引用的初始值必須為左值。 
const auto &j = 42; //正確:常量引用可以綁定到字面值。  

二. decltype簡(jiǎn)介

            有的時(shí)候我們還會(huì)遇到這種情況,我們希望從表達(dá)式中推斷出要定義變量的類(lèi)型,但卻不想用表達(dá)式的值去初始化變量。還有可能是函數(shù)的返回類(lèi)型為某表達(dá)式的的值類(lèi)型。在這些時(shí)候auto顯得就無(wú)力了,所以C++11又引入了第二種類(lèi)型說(shuō)明符decltype,它的作用是選擇并返回操作數(shù)的數(shù)據(jù)類(lèi)型。在此過(guò)程中,編譯器只是分析表達(dá)式并得到它的類(lèi)型,卻不進(jìn)行實(shí)際的計(jì)算表達(dá)式的值。

decltype(f()) sum = x;// sum的類(lèi)型就是函數(shù)f的返回值類(lèi)型。 

在這里編譯器并不實(shí)際調(diào)用f函數(shù),而是分析f函數(shù)的返回值作為sum的定義類(lèi)型。

 基本上decltype的作用和auto很相似,就不一一列舉了。對(duì)于decltype還有一個(gè)用途就是在c++11引入的后置返回類(lèi)型。

三. decltype 和 auto 區(qū)別

            decltype在處理頂層const和引用的方式與auto有些許不同,如果decltype使用的表達(dá)式是一個(gè)變量,則decltype返回該變量的類(lèi)型(包括頂層const和引用在內(nèi))。

const int ci = 42, &cj = ci; 
 
decltype(ci) x = 0;  // x 類(lèi)型為const int 
auto z = ci;     // z 類(lèi)型為int 
 
decltype(cj) y = x;  // y 類(lèi)型為const int& 
auto h = cj;     // h 類(lèi)型為int 

           decltype還有一些值得注意的地方,我們先來(lái)看看下面這段代碼:

int i = 42, *p = &i, &r = i; 
 
decltype(i) x1 = 0;    //因?yàn)?i 為 int ,所以 x1 為int 
auto x2 = i;       //因?yàn)?i 為 int ,所以 x2 為int 
 
decltype(r) y1 = i;    //因?yàn)?r 為 int& ,所以 y1 為int& 
auto y2 = r;       //因?yàn)?r 為 int& ,但auto會(huì)忽略引用,所以 y2 為int 
 
decltype(r + 0) z1 = 0;  //因?yàn)?r + 0 為 int ,所以 z1 為int, 
auto z2 = r + 0;     //因?yàn)?r + 0 為 int ,所以 z2 為int, 
 
decltype(*p) h1 = i;   //這里 h1 是int&, 原因后面講 
auto h2 = *p;       // h2 為 int. 

           如果表達(dá)式的內(nèi)容是解引用操作,則decltype將得到引用類(lèi)型。正如我們所熟悉的那樣,解引用指針可以得到指針?biāo)笇?duì)象,而且還可以給這個(gè)對(duì)象賦值。因此decltype(*p)的結(jié)果類(lèi)型就是int&.

           decltype和auto還有一處重要的區(qū)別是,decltype的結(jié)果類(lèi)型與表達(dá)形式密切相關(guān)。有一種情況需要特別注意:對(duì)于decltype 所用表達(dá)式來(lái)說(shuō),如果變量名加上一對(duì)括號(hào),則得到的類(lèi)型與不加上括號(hào)的時(shí)候可能不同。如果decltype使用的是一個(gè)不加括號(hào)的變量,那么得到的結(jié)果就是這個(gè)變量的類(lèi)型。但是如果給這個(gè)變量加上一個(gè)或多層括號(hào),那么編譯器會(huì)把這個(gè)變量當(dāng)作一個(gè)表達(dá)式看待,變量是一個(gè)可以作為左值的特殊表達(dá)式,所以這樣的decltype就會(huì)返回引用類(lèi)型:

int i = 42; 
 
//decltype(i)  int 類(lèi)型 
//decltype((i)) int& 類(lèi)型 

           這里再指出一個(gè)需要注意的地方就是 = 賦值運(yùn)算符返回的是左值的引用。換句話(huà)意思就是說(shuō) decltype(i = b)  返回類(lèi)型為 i 類(lèi)型的引用。仔細(xì)看下面這段代碼:

int main() 
{ 
  int i = 42; 
 
  decltype(i = 41) x = i; 
 
  auto y = i; 
 
  auto& z = i; 
 
  printf("i x y z 此時(shí)為: %d %d %d %d\n", i,x,y,z); 
 
  i--; 
 
  printf("i x y z 此時(shí)為: %d %d %d %d\n", i, x, y, z); 
 
  x--; 
 
  printf("i x y z 此時(shí)為: %d %d %d %d\n", i, x, y, z); 
 
  y--; 
 
  printf("i x y z 此時(shí)為: %d %d %d %d\n", i, x, y, z); 
 
  z--; 
 
  printf("i x y z 此時(shí)為: %d %d %d %d\n", i, x, y, z); 
 
  return 0; 
} 

運(yùn)行結(jié)果為:

i x y z 此時(shí)為: 42 42 42 42
i x y z 此時(shí)為: 41 41 42 41
i x y z 此時(shí)為: 40 40 42 40
i x y z 此時(shí)為: 40 40 41 40
i x y z 此時(shí)為: 39 39 41 39

     由上面的代碼和運(yùn)行結(jié)果可以看出來(lái),1.decltype(i = 41)中的賦值語(yǔ)句并沒(méi)有真正的運(yùn)行。2. decltype(i = 41)返回的其實(shí)是int&,也就是說(shuō)x 其實(shí)是 i 的引用。

了解了auto 和 decltype后,以后在使用的過(guò)程中一定要分清兩者的區(qū)別,防止在定義的時(shí)候產(chǎn)生const 與非const 以及引用 與非引用 的差別??!

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)掃雷游戲源代碼

    C語(yǔ)言實(shí)現(xiàn)掃雷游戲源代碼

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷游戲源代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • C語(yǔ)言高效編程的幾招小技巧

    C語(yǔ)言高效編程的幾招小技巧

    這篇文章主要介紹了C語(yǔ)言高效編程的幾招小技巧,本文講解了以空間換時(shí)間、用數(shù)學(xué)方法解決問(wèn)題以及使用位操作等編輯技巧,并給出若干方法和代碼實(shí)例,需要的朋友可以參考下
    2015-05-05
  • C++中的 % 的含義說(shuō)明

    C++中的 % 的含義說(shuō)明

    很多朋友私信小編不理解C++中的 % 的含義,其實(shí)有兩種意思,一種是格式化字符串輸出另一種是整數(shù)取余,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2023-03-03
  • QT實(shí)現(xiàn)簡(jiǎn)單時(shí)鐘效果

    QT實(shí)現(xiàn)簡(jiǎn)單時(shí)鐘效果

    這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)簡(jiǎn)單時(shí)鐘效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Qt編程實(shí)現(xiàn)小時(shí)鐘

    Qt編程實(shí)現(xiàn)小時(shí)鐘

    這篇文章主要為大家詳細(xì)介紹了Qt編程實(shí)現(xiàn)小時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C語(yǔ)言之整數(shù)劃分問(wèn)題(遞歸法)實(shí)例代碼

    C語(yǔ)言之整數(shù)劃分問(wèn)題(遞歸法)實(shí)例代碼

    這篇文章主要介紹了C語(yǔ)言之整數(shù)劃分問(wèn)題(遞歸法)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • C++指針和數(shù)組:字符和字符串、字符數(shù)組的關(guān)聯(lián)和區(qū)別

    C++指針和數(shù)組:字符和字符串、字符數(shù)組的關(guān)聯(lián)和區(qū)別

    字符串是一種重要的數(shù)據(jù)類(lèi)型,但是c語(yǔ)言并沒(méi)有顯示的字符串?dāng)?shù)據(jù)類(lèi)型,因?yàn)樽址宰址A康男问匠霈F(xiàn)或者存儲(chǔ)于字符數(shù)組中。在C++標(biāo)準(zhǔn)模板庫(kù)(STL)中提供了string類(lèi),實(shí)現(xiàn)了對(duì)字符串的封裝。
    2022-12-12
  • C語(yǔ)言鏈接屬性的實(shí)踐應(yīng)用

    C語(yǔ)言鏈接屬性的實(shí)踐應(yīng)用

    C語(yǔ)言中鏈接屬性決定如何處理在不同文件中出現(xiàn)的標(biāo)示符,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言鏈接屬性的實(shí)踐應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • 利用Qt實(shí)現(xiàn)FTP服務(wù)器并支持多客戶(hù)端登錄

    利用Qt實(shí)現(xiàn)FTP服務(wù)器并支持多客戶(hù)端登錄

    這篇文章主要為大家詳細(xì)介紹了如何利用Qt實(shí)現(xiàn)FTP服務(wù)器并支持多客戶(hù)端登錄,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • C語(yǔ)言的字符串函數(shù),內(nèi)存函數(shù)筆記詳解

    C語(yǔ)言的字符串函數(shù),內(nèi)存函數(shù)筆記詳解

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言字符串/內(nèi)存的相關(guān)函數(shù),文中通過(guò)示例代碼總結(jié)的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C語(yǔ)言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-09-09

最新評(píng)論

呼和浩特市| 鄂温| 闻喜县| 南安市| 桐乡市| 绥化市| 滨州市| 津南区| 体育| 鄂尔多斯市| 香格里拉县| 中西区| 九龙县| 客服| 垫江县| 阿尔山市| 松阳县| 得荣县| 苏尼特右旗| 昌平区| 兴业县| 罗田县| 鄂伦春自治旗| 江门市| 拉萨市| 韩城市| 温泉县| 治县。| 乌鲁木齐县| 法库县| 绥阳县| 土默特右旗| 汪清县| 收藏| 文水县| 板桥市| 丰城市| 曲周县| 甘泉县| 灵川县| 廉江市|