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

C++ auto類型說明符

 更新時(shí)間:2016年03月13日 15:54:26   投稿:hebedich  
在C++11中引入了auto類型說明符,用它就能讓編譯器替我們?nèi)シ治霰磉_(dá)式所屬的類型。當(dāng)然,auto變量必須有初始值,這樣編譯器才能推斷其類型

編程時(shí)常常需要把表達(dá)式的值賦給變量,這就要求在聲明變量的時(shí)候清楚知道表達(dá)式的類型。然而要做到這一點(diǎn)并非那么容易,有時(shí)候甚至根本做不到。為了解決這個(gè)問題,C++11標(biāo)準(zhǔn)引入了auto類型說明符,用它就能讓編譯器替我們?nèi)シ治霰磉_(dá)式所屬的類型。

與原來那些只對應(yīng)一種特定類型的說明符不同,auto讓編譯器通過初值來推算變量類型。顯然,auto定義的變量必須要有初始值。

使用auto具有以下幾點(diǎn)好處:

可靠性:如果表達(dá)式的類型發(fā)生更改(包括函數(shù)返回值發(fā)生更改的情況),它也能工作。
性能:確保將不會進(jìn)行轉(zhuǎn)換。
可用性:不必?fù)?dān)心類型名稱拼寫困難和拼寫有誤。
效率:代碼會變得更高效。

auto item = val1 + val2; // 由val1和val2相加的結(jié)果推斷出item的類型
auto i=0, *p = &i; // i是整數(shù),p是整型指針

使用auto能在一條語句中聲明多個(gè)變量。但是一條聲明語句只能有一個(gè)基本數(shù)據(jù)類型,所以該語句中所有變量的初始基本數(shù)據(jù)類型都必須一致:

auto sz = 0, pi = 3.14; // Error!

編譯器推斷出的auto類型有時(shí)候和初始值的類型并不完全一樣,編譯器會適當(dāng)?shù)馗淖兘Y(jié)果類型使其更符合初始化規(guī)則,例如:

使用auto會刪除引用

int count = 10;
int& countRef = count;
auto myAuto = countRef;

countRef = 11;
cout << count << " "; // print 11

myAuto = 12;
cout << count << endl; // print 11

你可能會認(rèn)為 myAuto 是一個(gè) int 引用,但它不是。它只是一個(gè) int,因?yàn)檩敵鰹?11 11,而不是 11 12;如果 auto 尚未刪除此引用,則會出現(xiàn)此情況。

const限定符
先引入一種表述:頂層const表示指針本身是個(gè)常量,底層const表示指針?biāo)傅膶ο笫且粋€(gè)常量。一般auto會忽略掉頂層const,同時(shí)底層const則會保留下來,例如:

int i = 0;
const int ci = i, &cr = ci;
auto b = ci; // b 是一個(gè)整數(shù)(ci的頂層const特性被忽略掉)
auto c = cr; // c 是一個(gè)整數(shù)(cr是ci的別名,ci本身是一個(gè)頂層const)
auto d = &i; // d 是一個(gè)整型指針(整數(shù)的地址就是指向整數(shù)的指針)
auto e = &ci; // e 是一個(gè)指向整數(shù)常量的指針(對常量對象取地址是一種底層const)

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

const auto f = ci; // ci 的推演類型是int,f是const int類型

還可以將引用的類型設(shè)置為auto,此時(shí)原來的初始化規(guī)則仍然適用:

auto &g = ci; // g是一個(gè)整型常量引用,綁定到ci
auto &h = 42; // Error: 不能為非常量引用綁定字面值
const auto &j = 42; // OK: 可以為常量引用綁定字面值

切記,符號*和&只從屬于某個(gè)聲明,而非基本數(shù)據(jù)類型的一部分,因此初始值必須是同一類型:

auto k = ci, &l = i; // k是整數(shù),l是整型引用
auto &m = ci, *p = &ci; // m是對整型常量的引用,p是指向整型常量的指針
auto &n = i, *p2 = &ci; // Error: i的類型是int,而&ci的類型是const int

附上更多示例代碼:

下面的聲明等效。在第一個(gè)語句中,將變量j 聲明為類型 int。在第二個(gè)語句中,將變量 k 推導(dǎo)為類型 int,因?yàn)槌跏蓟磉_(dá)式 (0) 是整數(shù)

int j = 0; // Variable j is explicitly type int.
auto k = 0; // Variable k is implicitly type int because 0 is an integer.

以下聲明等效,但第二個(gè)聲明比第一個(gè)更簡單。使用 auto 關(guān)鍵字的最令人信服的一個(gè)原因是簡單

map<int,list<string>>::iterator i = m.begin(); 
auto i = m.begin(); 

使用 iter 和 elem 啟動循環(huán)時(shí)

#include <deque>
using namespace std;

int main()
{
  deque<double> dqDoubleData(10, 0.1);

  for (auto iter = dqDoubleData.begin(); iter != dqDoubleData.end(); ++iter)
  { /* ... */ }

  // prefer range-for loops with the following information in mind
  // (this applies to any range-for with auto, not just deque)

  for (auto elem : dqDoubleData) // COPIES elements, not much better than the previous examples
  { /* ... */ }

  for (auto& elem : dqDoubleData) // observes and/or modifies elements IN-PLACE
  { /* ... */ }

  for (const auto& elem : dqDoubleData) // observes elements IN-PLACE
  { /* ... */ }
}

下面的代碼片段使用 new 運(yùn)算符和指針聲明來聲明指針

double x = 12.34;
auto *y = new auto(x), **z = new auto(&x);

下一個(gè)代碼片段在每個(gè)聲明語句中聲明多個(gè)符號。請注意,每個(gè)語句中的所有符號將解析為同一類型。

auto x = 1, *y = &x, **z = &y; // Resolves to int.
auto a(2.01), *b (&a);     // Resolves to double.
auto c = 'a', *d(&c);     // Resolves to char.
auto m = 1, &n = m;      // Resolves to int.

此代碼片段使用條件運(yùn)算符 (?:) 將變量 x 聲明為值為 200 的整數(shù):

int v1 = 100, v2 = 200;
auto x = v1 > v2 ? v1 : v2;

下面的代碼片段將變量 x 初始化為類型 int,將變量 y初始化對類型 const int 的引用,將變量 fp 初始化為指向返回類型 int 的函數(shù)的指針。

int f(int x) { return x; }
int main()
{
  auto x = f(0);
  const auto & y = f(1);
  int (*p)(int x);
  p = f;
  auto fp = p;
  //...
}

相關(guān)文章

  • tinyxml 常用的C++ XML解析器非常優(yōu)秀

    tinyxml 常用的C++ XML解析器非常優(yōu)秀

    讀取和設(shè)置xml配置文件是最常用的操作,試用了幾個(gè)C++的XML解析器,個(gè)人感覺TinyXML是使用起來最舒服的,因?yàn)樗腁PI接口和Java的十分類似,面向?qū)ο笮院芎?/div> 2012-11-11
  • C/C++編譯報(bào)錯(cuò)printf was not declared in this scope問題及解決

    C/C++編譯報(bào)錯(cuò)printf was not declared in 

    這篇文章主要介紹了C/C++編譯報(bào)錯(cuò)printf was not declared in this scope問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++構(gòu)造函數(shù)的初始化列表詳解

    C++構(gòu)造函數(shù)的初始化列表詳解

    這篇文章主要為大家介紹了C++構(gòu)造函數(shù)的初始化列表,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • C數(shù)據(jù)結(jié)構(gòu)中串簡單實(shí)例

    C數(shù)據(jù)結(jié)構(gòu)中串簡單實(shí)例

    這篇文章主要介紹了C數(shù)據(jù)結(jié)構(gòu)中串簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C語言全面梳理文件操作方法

    C語言全面梳理文件操作方法

    這篇文章主要為大家詳細(xì)介紹了C語言的文件操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-05-05
  • 解決C語言數(shù)組元素循環(huán)右移的問題

    解決C語言數(shù)組元素循環(huán)右移的問題

    今天小編就為大家分享一篇解決C語言數(shù)組元素循環(huán)右移的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • C語言統(tǒng)計(jì)字符個(gè)數(shù)代碼分享

    C語言統(tǒng)計(jì)字符個(gè)數(shù)代碼分享

    本文給大家分享的是2則C語言實(shí)現(xiàn)統(tǒng)計(jì)字符個(gè)數(shù)的代碼,非常的簡單實(shí)用,小伙伴們根據(jù)自己的項(xiàng)目需求自由選擇吧。
    2015-07-07
  • C++虛函數(shù)注意事項(xiàng)

    C++虛函數(shù)注意事項(xiàng)

    這篇文章主要給大家分享了EC++虛函數(shù)注意事項(xiàng),
    2022-01-01
  • 利用Matlab繪制甘特圖的方法詳解

    利用Matlab繪制甘特圖的方法詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Matlab實(shí)現(xiàn)甘特圖(gantt?chart)的繪制,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Matlab有一定幫助,需要的可以參考一下
    2022-10-10
  • C語言實(shí)現(xiàn)職工工資管理系統(tǒng)

    C語言實(shí)現(xiàn)職工工資管理系統(tǒng)

    這篇文章主要介紹了C語言實(shí)現(xiàn)職工工資管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評論

晋城| 莱西市| 大新县| 拉萨市| 南江县| 弥渡县| 房山区| 龙里县| 蓝田县| 和政县| 西青区| 外汇| 景宁| 攀枝花市| 碌曲县| 兴宁市| 万年县| 班戈县| 佛坪县| 连江县| 宜丰县| 桓台县| 革吉县| 克什克腾旗| 林芝县| 太康县| 迁西县| 田阳县| 利川市| 拜泉县| 板桥市| 涞水县| 章丘市| 巴中市| 大安市| 慈利县| 阿拉善左旗| 慈溪市| 光山县| 芜湖市| 门源|