auto可以在宣告變數的時候根據變數初始值的型別自動為此變數選擇匹配的型別,類似的關鍵字還有decltype。舉個例子:
int a = 10;
auto au_a = a;//自動型別推斷,au_a為int型別
cout
<< typeid(au_a).name() << endl;
typeid運算子可以輸出變數的型別。程式的執行結果輸出了
int
這種用法就類似於c#中的var關鍵字。auto的自動型別推斷發生在編譯期,所以使用auto並不會造成程式執行時效率的降低。而是否會造成編譯期的時間消耗,我認為是不會的,在未使用auto時,編譯器也需要得知右運算元的型別,再與左運算元的型別進行比較,檢查是否可以發生相應的轉化,是否需要進行隱式型別轉換。
上面舉的這個例子很簡單,在真正程式設計的時候也不建議這樣來使用auto,直接寫出變數的型別更加清晰易懂。下面列舉auto關鍵字的正確用法。
用於代替冗長複雜、變數使用範圍專一的變數宣告。
想象一下在沒有auto的時候,我們操作標準庫時經常需要這樣:
#include
#include
int main()
}
這樣看**寫**實在煩得很。有人可能會說為何不直接使用using namespace std
,這樣**可以短一點。實際上這不是該建議的方法(c++primer對此有相關敘述)。使用auto能簡化**:
#include
#include
int main()
}
for迴圈中的i將在編譯時自動推導其型別,而不用我們顯式去定義那長長的一串。
在定義模板函式時,用於宣告依賴模板引數的變數型別。
template
void multiply(_tx x, _ty y)
若不使用auto
變數來宣告v
,那這個函式就難定義啦,不到編譯的時候,誰知道x*y
的真正型別是什麼呢?
模板函式依賴於模板引數的返回值
template
auto multiply(_tx x, _ty y)->decltype(x*y)
當模板函式的返回值依賴於模板的引數時,我們依舊無法在編譯**前確定模板引數的型別,故也無從知道返回值的型別,這時我們可以使用auto。格式如上所示。
decltype
操作符用於查詢表示式的資料型別,也是c++11標準引入的新的運算子,其目的也是解決泛型程式設計中有些型別由模板引數決定,而難以表示它的問題。
auto
在這裡的作用也稱為返回值佔位,它只是為函式返回值佔了乙個位置,真正的返回值是後面的decltype(_tx*_ty)
。為何要將返回值後置呢?如果沒有後置,則函式宣告時為:
decltype(x*y)multiply(_tx x, _ty y)
而此時x,y還沒宣告呢,編譯無法通過。
auto
變數必須在定義時初始化,這類似於const
關鍵字。
定義在乙個auto序列的變數必須始終推導成同一型別。例如:
auto a4 = 10, a5 = 20, a6 = 30;//正確
auto b4 = 10, b5 = 20.0, b6 = 'a';//錯誤,沒有推導為同一型別
使用auto
關鍵字做型別自動推導時,依次施加一下規則:
如果初始化表示式是引用,則去除引用語義。
int a = 10;
int &b = a;
auto c = b;//c的型別為int而非int&(去除引用)
auto &d = b;//此時c的型別才為int&
c = 100;//a =10;
d = 100;//a =100;
如果初始化表示式為const
或volatile
(或者兩者兼有),則除去const/volatile語義。
const
int a1 = 10;
auto b1= a1; //b1的型別為int而非const int(去除const)
const
auto c1 = a1;//此時c1的型別為const int
b1 = 100;//合法
c1 = 100;//非法
如果auto
關鍵字帶上&
號,則不去除const
語意。
const
int a2 = 10;
auto &b2 = a2;//因為auto帶上&,故不去除const,b2型別為const int
b2 = 10; //非法
這是因為如何去掉了const
,則b2
為a2
的非const
引用,通過b2
可以改變a2
的值,則顯然是不合理的。
初始化表示式為陣列時,auto
關鍵字推導型別為指標。
int a3[3] = ;
auto b3 = a3;
cout
<< typeid(b3).name() << endl;
程式將輸出
int *
若表示式為陣列且auto
帶上&
,則推導型別為陣列型別。
int a7[3] = ;
auto & b7 = a7;
cout
<< typeid(b7).name() << endl;
程式輸出
int [3]
函式或者模板引數不能被宣告為auto
void func(auto a) //錯誤
時刻要注意auto
並不是乙個真正的型別。
auto
僅僅是乙個佔位符,它並不是乙個真正的型別,不能使用一些以型別為運算元的操作符,如sizeof
或者typeid
。
cout
<< sizeof(auto) << endl;//錯誤
cout
<< typeid(auto).name() << endl;//錯誤
C C auto關鍵字的使用
早在c 98標準中就存在了auto關鍵字,那時的auto用於宣告變數為自動變數,自動變數意為擁有自動的生命期,這是多餘的,因為就算不使用auto宣告,變數依舊擁有自動的生命期 int a 10 擁有自動生命期 auto int b 20 擁有自動生命期 static int c 30 延長了生命期c...
this關鍵字使用
一,表示類中屬性 1,沒有使用this的情況 class person public string getinfo public class thisdemo01 執行結果 姓名 null,年齡 0 可以得出結論 此時並沒有正確將內容賦給屬性 假設身邊有乙隻筆,遠處也有乙隻筆,肯定會就近拿身邊的筆。...
this關鍵字的使用
我們曾經曰 起名字要做到見名知意。this 是當前類的物件引用。簡單的記,它就代表當前類的乙個物件。注意 誰呼叫這個方法,在該方法內部的this就代表誰。this的場景 解決區域性變數隱藏成員變數 定義學生類 class student 姓名設定值 public void setname strin...