C++ auto類型說明符
編程時(shí)常常需要把表達(dá)式的值賦給變量,這就要求在聲明變量的時(shí)候清楚知道表達(dá)式的類型。然而要做到這一點(diǎn)并非那么容易,有時(shí)候甚至根本做不到。為了解決這個(gè)問題,C++11標(biāo)準(zhǔn)引入了auto類型說明符,用它就能讓編譯器替我們?nèi)シ治霰磉_(dá)式所屬的類型。
與原來那些只對(duì)應(yīng)一種特定類型的說明符不同,auto讓編譯器通過初值來推算變量類型。顯然,auto定義的變量必須要有初始值。
使用auto具有以下幾點(diǎn)好處:
可靠性:如果表達(dá)式的類型發(fā)生更改(包括函數(shù)返回值發(fā)生更改的情況),它也能工作。
性能:確保將不會(huì)進(jìn)行轉(zhuǎn)換。
可用性:不必?fù)?dān)心類型名稱拼寫困難和拼寫有誤。
效率:代碼會(huì)變得更高效。
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í)候和初始值的類型并不完全一樣,編譯器會(huì)適當(dāng)?shù)馗淖兘Y(jié)果類型使其更符合初始化規(guī)則,例如:
使用auto會(huì)刪除引用
int count = 10; int& countRef = count; auto myAuto = countRef; countRef = 11; cout << count << " "; // print 11 myAuto = 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ì)保留下來,例如:
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類型是一個(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: 可以為常量引用綁定字面值
切記,符號(hào)*和&只從屬于某個(gè)聲明,而非基本數(shù)據(jù)類型的一部分,因此初始值必須是同一類型:
auto k = ci, &l = i; // k是整數(shù),l是整型引用 auto &m = ci, *p = &ci; // m是對(duì)整型常量的引用,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è)更簡(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)算符和指針聲明來聲明指針
double x = 12.34; auto *y = new auto(x), **z = new auto(&x);
下一個(gè)代碼片段在每個(gè)聲明語句中聲明多個(gè)符號(hào)。請(qǐng)注意,每個(gè)語句中的所有符號(hào)將解析為同一類型。
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初始化對(duì)類型 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; //... }
上一篇:C++中實(shí)現(xiàn)隊(duì)列類鏈?zhǔn)酱鎯?chǔ)與棧類鏈?zhǔn)酱鎯?chǔ)的代碼示例
欄 目:C語言
下一篇:C語言中壓縮字符串的簡(jiǎn)單算法小結(jié)
本文標(biāo)題:C++ auto類型說明符
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2434.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式詳解
- 01-10深入理解C/C++混合編程


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文