国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

C++ auto類(lèi)型說(shuō)明符

2020-01-26 14:41:39
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

編程時(shí)常常需要把表達(dá)式的值賦給變量,這就要求在聲明變量的時(shí)候清楚知道表達(dá)式的類(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ō)明符不同,auto讓編譯器通過(guò)初值來(lái)推算變量類(lèi)型。顯然,auto定義的變量必須要有初始值。

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

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

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

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

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

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

使用auto會(huì)刪除引用

int count = 10;int& countRef = count;auto myAuto = countRef;countRef = 11;cout << count << " "; // print 11myAuto = 12;cout << count << endl; // print 11

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

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

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ù)常量的指針(對(duì)常量對(duì)象取地址是一種底層const)

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

const auto f = ci; // ci 的推演類(lèi)型是int,f是const int類(lèi)型

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

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

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

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

附上更多示例代碼:

下面的聲明等效。在第一個(gè)語(yǔ)句中,將變量j 聲明為類(lèi)型 int。在第二個(gè)語(yǔ)句中,將變量 k 推導(dǎo)為類(lèi)型 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è)更簡(jiǎn)單。使用 auto 關(guān)鍵字的最令人信服的一個(gè)原因是簡(jiǎn)單

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

使用 iter 和 elem 啟動(dòng)循環(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)算符和指針聲明來(lái)聲明指針

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

下一個(gè)代碼片段在每個(gè)聲明語(yǔ)句中聲明多個(gè)符號(hào)。請(qǐng)注意,每個(gè)語(yǔ)句中的所有符號(hào)將解析為同一類(lèi)型。

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 初始化為類(lèi)型 int,將變量 y初始化對(duì)類(lèi)型 const int 的引用,將變量 fp 初始化為指向返回類(lèi)型 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;  //...}

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 龙里县| 鄄城县| 天柱县| 日照市| 班玛县| 南充市| 泰安市| 南乐县| 个旧市| 嵊州市| 庐江县| 巴马| 东海县| 龙山县| 平乐县| 保山市| 井冈山市| 郁南县| 沾化县| 衢州市| 宜宾县| 望奎县| 阳原县| 岳阳市| 海淀区| 岳池县| 三都| 许昌县| 资中县| 运城市| 株洲市| 丹寨县| 合阳县| 靖远县| 临安市| 湾仔区| 林周县| 务川| 张家港市| 玛多县| 房山区|