1、auto的概念
在C++11
中,auto
不再是一個存儲類型指示符,而是作爲一個新的類型指示符來指示編譯器,auto
聲明的變量必須由編譯器在編譯時期推導而得。
2、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;
return 0;
}
運行結果:
解析:
在編譯階段編譯器根據初始化表達式來推導auto
的實際類型。因此auto
並非是一種“類型”的聲明,而是一個類型聲明時的“佔位符”,編譯器在編譯期會將auto替換爲變量實際的類型。
注意:
1、在使用auto時必須對其進行初始化。
2、當在同一行聲明多個變量時,這些變量必須是相同的類型,否則編譯器將會報錯,因爲編譯器實際只對第一個類型進行推導,然後用推導出來的類型定義其他變量。 列如:
void TestAuto()
{
auto c = 3, d = 4.0; // 該行代碼會編譯失敗,因爲c和d的初始化表達式類型不同
}
2、auto不能作爲函數的參數。 列如:
void TestAuto(auto a) {} //錯誤
3、auto不能直接用來聲明數組。 列如:
auto b[] = {4,5,6}; //錯誤
4、 auto不能定義類的非靜態成員變量
5、實例化模板時不能使用auto作爲模板參數
3、基於範圍的for循環
實列說明:
#include<iostream>
using namespace std;
int main()
{
int array[] = { 1, 2, 3, 4, 5 };
for (auto& e : array)
e *= 2;
for (auto e : array)
cout << e << " ";
return 0;
}
運作結果:
解析:
for循環後的括號由冒號“ :”分爲兩部分:第一部分是範圍內用於迭代的變量,這個變量可以隨意設置;第二部分則表示被迭代的範圍,也就是要循環的目標。一般來說,auto
通常和這樣的for
循環結合起來使用。
4、範圍for的使用條件
1、for循環迭代的範圍必須是確定的 。對於數組而言,就是數組中第一個元素和後一個元素的範圍;對於類而言,應該提供begin和end的方法, begin和end就是for循環迭代的範圍。列如下面的代碼就是錯誤的:
void TestFor(int array[])
{
for(auto& e : array)
cout<< e <<endl;
}
這是因爲數組array
作爲函數參數時,會隱式的轉化爲指針。
2、只會執行++
和==
操作,也就是說只有執行遍歷操作時(列如:遍歷整個數組的元素時),纔可使用它。