?
目錄
1.auto簡介
2.auto的使用?
1.auto簡介
在早期C/C++中auto的含義是:使用auto修飾的變量,是具有自動存儲器的局部變量,但遺憾的 是一直沒有人去使用它,大家可思考下為什么? C++11中,標準委員會賦予了auto全新的含義即:auto不再是一個存儲類型指示符,而是作為一 個新的類型指示符來指示編譯器,auto聲明的變量必須由編譯器在編譯時期推導而得。
補充:typid(),用于打印變量的類型
編寫如下代碼:
所以結論:auto關鍵字可以自動推導類型。?
引入auto的原因:
隨著程序越來越復雜,程序中用到的類型也越來越復雜,經常體現在:
1.類型難于拼寫
2.含義不明確容易出錯。
如果沒有auto,我們通過一個復雜的類型來定義變量:
vector<string> v;
vector<string>::iterator it = v.begin();
如果使用auto關鍵字:
vector<string> v;
//vector<string>::iterator it = v.begin();
auto it = v.begin();
為什么不使用typedef來實現類型重定義:
首先使用typedef確實可以給類型取別名,也可以簡化代碼。如下:
不使用typedef
std::map<std::string, std::string> m{ { "apple", "蘋果" }, { "orange","橙子" },{"pear","梨"} };
使用后:
typedef std::map<std::string, std::string> Map;
Map m{ { "apple", "蘋果" },{ "orange", "橙子" }, {"pear","梨"} };
但是問題在于:編程時往往需要將表達式的值賦值給變量,要求在聲明變量時清楚的知道表達質的類型。
2.auto的使用?
①使用auto定義變量時必須對其進行初始化,在編譯階段編譯器需要根據初始化表達式來推導auto的實際類型。因此auto并非是一種類型的聲明,而是一個類型聲明時的占位符,編譯器在編譯期間會將auto替換為變量實際的類型。
②auto不可以作為函數的參數。
?原因:如果我能調用這個函數的話,auto這個形參的類型就和我們傳入的參數的類型保持一致,如果我們不調用函數的話,auto就不能匹配類型。
③auto不能做函數返回值
我們調用一個函數,主要關注的就是函數的返回值和參數,如果返回值的類型不確定,那么我們調用這個函數的結果也是不確定的。
④使用auto聲明指針類型的時候,用auto和auto*沒有任何區別
⑤使用auto聲明引用類型時必須加上&
?⑥使用auto在同行聲明多個變量的時候,這些變量必須是相同的類型,否則編譯器會報錯,因為編譯器實際只會對同一個類型進行推導,然后使用推導出來的類型定義其他變量。
⑦auto不能用于聲明數組,這是一個規定?