1.auto關鍵字(自動型別推導)
在c++11中auto有了全新的含義:auto不再是乙個儲存型別指示符,而是作為乙個新的型別指示符來指示編譯器,auto宣告的變數必須由編譯器在編譯時期推導而得
1.舉幾個例子
int
testauto()
intmain()
需要注意的是auto並不能代表乙個實際的型別宣告,只是乙個型別宣告時的「佔位符」。使用auto定義變數必須初始化,以便編譯器推斷出auto的實際型別,並且在編譯時編譯器會將auto替換為變數真正的型別。
auto a;
//此時無法通過編譯,使用auto定義變數時必須對其進行初始化
2.auto與指標,引用結合使用
int
main()
注意:使用auto宣告指標型別時,auto與auto*沒有區別
使用auto宣告引用型別時要加 &
3.auto使用時的一些注意細節
1.使用時必須初始化
auto a =
10;
2.使用時不能與其它型別連用
auto
int a;
//不能這樣用
3.auto不能作為函式和模板引數
void
func
(auto a)
//不能用作函式引數
template
<
auto t>
//不能用作模板引數
void
fun(t t)
4.auto不能直接宣告陣列
void
func()
;auto b=
;}
5.auto不能用於非成員變數
struct foo
;
ps:auto僅能夠用於推導static const的整型或者列舉成員(因為其他靜態成員無法在類或是結構體中就地完成初始化,都需要在類的外部進行初始化)。c++11中支援非靜態成員變數的就地初始化,但卻不支援auto型別的非靜態成員變數初始化。
6.在同一行的宣告多個變數時,這些變數必須是相同型別
void
testauto()
通過上面對auto關鍵字的理解,我們將auto與c++11提供的新式範圍for配合使用
先來看看在c98中如何遍歷乙個陣列
void
func()
;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;
}
在c++新標準中提供的範圍for的語法形式為:
for(declaration : expression)
statement
for迴圈後的括號由冒號「 :」分為兩部分:第一部分是範圍內用於迭代的變數,第二部分則表示被迭代的範圍。
還是上面那個遍歷陣列的例子
void
func()
;for
(auto
& e : array)
e *=2;
for(
auto e : array)
cout << e << endl;
}
這裡通過使用auto關鍵字讓編譯器來決定變數e的型別,這裡e的型別是int.每次迭代,array的下乙個元素被拷貝給e.然後再執行操作。
ps:for迴圈迭代的範圍必須是確定的,對於陣列而言,就是陣列中第乙個元素和最後乙個元素的範圍;對於類而言,應該提供begin和end的方法,begin和end就是for迴圈迭代的範圍
範圍for與普通迴圈差不多,也可使用break,continue語句
關鍵字auto,基於範圍的for迴圈
在早期c c 中auto的含義是 使用auto修飾的變數,是具有自動儲存器的區域性變數 c 11中,標準委員會賦予了auto全新的含義即 auto不再是乙個儲存型別指示符,而是作為乙個新的型別指示符來指示編譯器,auto宣告的變數必須由編譯器在編譯時期推導而得 int testauto intmai...
auto關鍵字 decltype關鍵字
自動型別推斷 1 使用auto關鍵字的變數必須有初始值。在定義的時候進行初始化 2 函式引數和模板引數不能被宣告為auto。3 使用auto關鍵字進行型別推導時,如果初始化表示式是引用型別,編譯器會去除引用,除非顯示宣告 4 使用auto使用auto關鍵字進行型別推導時,編譯器會自動忽略頂層cons...
auto關鍵字使用
auto型別變數 根據初始值推斷真實的資料型別。有些時候並不能很確定乙個變數應該具備的資料型別,例如 將乙個複雜表示式的值賦給某個變數,此時並不能很明顯的確定這個值所具備的資料型別。此時auto關鍵字可以派上用場。auto儲存型別說明符宣告了乙個自動變數,auto物件和變數被儲存在棧中,它的生命週期...