九、auto關鍵字
9.1 auto簡介
-
在早期C/C++(C++98)中auto的含義是:使用auto修飾的變量,是具有自動存儲器的局部變量,但遺憾的是一直沒有人去使用它。因為在函數(shù)內(nèi)定義的變量默認就是局部變量。
-
C++11中,標準委員會賦予了auto全新的含義即:auto不再是一個存儲類型指示符,而是作為一個新的類型指示符來指示編譯器,auto聲明的變量必須由編譯器在編譯時期推導而得。
-
為了避免與C++98中的auto發(fā)生混淆,C++11只保留了auto作為類型指示符的用法
int TestAuto()
{
return 10;
}
int main()
{
int a = 10;
auto b = a;
auto c = 'a';
auto d = TestAuto();
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
cout << typeid(d).name() << endl;
//auto e; 無法通過編譯,使用auto定義變量時必須對其進行初始化
return 0;
}
測試結果:
注意:使用auto定義變量時必須對其進行初始化,在編譯階段編譯器需要根據(jù)初始化表達式來推導auto的實際類型。因此auto并非是一種“類型”的聲明,而是一個類型聲明時的“占位符”,編譯器在編譯期會將auto替換為變量實際的類型。
9.2 auto的使用細則
-
auto與指針和引用結合起來使用
用auto聲明指針類型時,用auto和auto*沒有任何區(qū)別(只做類型強調(diào)用),但用auto聲明引用類型時則必須加&
int main()
{
int x = 10;
auto a = &x;
auto* b = &x;
auto& c = x;
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
*a = 20;
*b = 30;
c = 40;
return 0;
}
測試結果:
-
在同一行定義多個變量
當在同一行聲明多個變量時,這些變量必須是相同的類型,否則編譯器將會報錯,因為編譯器實際只對第一個類型進行推導,然后用推導出來的類型定義其他變量。
void TestAuto()
{
auto a = 1, b = 2;
auto c = 3, d = 4.0; // 該行代碼會編譯失敗,因為c和d的初始化表達式類型不同
}
9.3 auto不能推導的場景
-
auto不能作為函數(shù)參數(shù)的類型
// 此處代碼編譯失敗,auto不能作為形參類型,因為編譯器無法對a的實際類型進行推導 void TestAuto(auto a) {}
-
auto不能直接用來聲明數(shù)組
void TestAuto() { int a[] = {1,2,3}; auto b[] = {4,5,6}; }
9.4 auto的使用場景
-
隨著程序越來越復雜,程序中用到的類型也越來越復雜,經(jīng)常體現(xiàn)在:
-
類型難于拼寫
-
含義不明確導致容易出錯
當類型比較長或比較復雜的時候,auto自動推導類型就顯得十分方便
std::map<std::string, std::string> dict; //std::map<std::string, std::string>::iterator it = dict.begin(); auto it = dict.begin();
-
-
auto在實際中最常見的優(yōu)勢用法就是跟C++11提供的新式for循環(huán),還有l(wèi)ambda表達式等進行配合使用。
十、基于范圍的for循環(huán)
10.1 范圍for的語法
在C++98中如果要遍歷一個數(shù)組,可以按照以下方式進行:
void TestFor()
{
int array[] = { 1, 2, 3, 4, 5 };
for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
array[i] *= 2;
for (int* p = array; p < array + sizeof(array)/ sizeof(array[0]); ++p)
cout << *p << endl;
}
-
對于一個有范圍的集合而言,由程序員來說明循環(huán)的范圍是多余的,有時候還會容易犯錯誤。因此C++11中引入了基于范圍的for循環(huán)。for循環(huán)后的括號由冒號“ :”分為兩部分:第一部分是范圍內(nèi)用于迭代的變量,第二部分則表示被迭代的范圍。
-
用于迭代的變量會自動依次取指定范圍內(nèi)的數(shù)據(jù),并自動迭代,自動判斷范圍結束。
-
用于迭代的變量還可以取指定范圍內(nèi)數(shù)據(jù)的引用,并在循環(huán)中對范圍內(nèi)的數(shù)據(jù)進行修改。
void TestFor()
{
int array[] = { 1, 2, 3, 4, 5 };
for(auto& e : array) //取范圍內(nèi)數(shù)據(jù)的引用
e *= 2;
for(auto e : array) //取范圍內(nèi)數(shù)據(jù)的值
cout << e << " ";
return 0;
}
注意:與普通循環(huán)類似,可以用continue來結束本次循環(huán),也可以用break來跳出整個循環(huán)。
10.2 范圍for的使用條件
-
for循環(huán)迭代的范圍必須是確定的
對于數(shù)組而言,就是數(shù)組中第一個元素和最后一個元素的范圍;對于類而言,應該提供begin和end的方法,begin和end就是for循環(huán)迭代的范圍。
以下這段代碼就有問題:文章來源:http://www.zghlxwxcb.cn/news/detail-412344.html
void TestFor(int array[]) { //array是指針,存放數(shù)組首元素的地址 for(auto& e : array) cout<< e <<endl; //這段代碼有問題,因為for的范圍不確定 }
-
迭代的對象(迭代器)要實現(xiàn)++和==的操作。文章來源地址http://www.zghlxwxcb.cn/news/detail-412344.html
到了這里,關于【C++基礎】auto關鍵字(C++11)(auto的使用細則;auto不能推導的場景;auto的使用場景;基于范圍的for循環(huán))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!