C++ auto類型解釋符。本站提示廣大學習愛好者:(C++ auto類型解釋符)文章只能為提供參考,不一定能成為您想要的結果。以下是C++ auto類型解釋符正文
編程經常常須要把表達式的值賦給變量,這就請求在聲明變量的時刻清晰曉得表達式的類型。但是要做到這一點並不是那末輕易,有時刻乃至基本做不到。為懂得決這個成績,C++11尺度引入了auto類型解釋符,用它就可以讓編譯器替我們去剖析表達式所屬的類型。
與本來那些只對應一種特定類型的解釋符分歧,auto讓編譯器經由過程初值來推算變量類型。明顯,auto界說的變量必需要有初始值。
應用auto具有以下幾點利益:
靠得住性:假如表達式的類型產生更改(包含函數前往值產生更改的情形),它也能任務。
機能:確保將不會停止轉換。
可用性:不用擔憂類型稱號拼寫艱苦和拼寫有誤。
效力:代碼會變得更高效。
auto item = val1 + val2; // 由val1和val2相加的成果揣摸出item的類型 auto i=0, *p = &i; // i是整數,p是整型指針
應用auto能在一條語句中聲明多個變量。然則一條聲明語句只能有一個根本數據類型,所以該語句中一切變量的初始根本數據類型都必需分歧:
auto sz = 0, pi = 3.14; // Error!
編譯器揣摸出的auto類型有時刻和初始值的類型其實不完整一樣,編譯器會恰當地轉變成果類型使其更相符初始化規矩,例如:
應用auto會刪除援用
int count = 10; int& countRef = count; auto myAuto = countRef; countRef = 11; cout << count << " "; // print 11 myAuto = 12; cout << count << endl; // print 11
你能夠會以為 myAuto 是一個 int 援用,但它不是。它只是一個 int,由於輸入為 11 11,而不是 11 12;假如 auto 還沒有刪除此援用,則會湧現此情形。
const限制符
先引入一種表述:頂層const表現指針自己是個常量,底層const表現指針所指的對象是一個常量。普通auto會疏忽失落頂層const,同時底層const則會保存上去,例如:
int i = 0; const int ci = i, &cr = ci; auto b = ci; // b 是一個整數(ci的頂層const特征被疏忽失落) auto c = cr; // c 是一個整數(cr是ci的別號,ci自己是一個頂層const) auto d = &i; // d 是一個整型指針(整數的地址就是指向整數的指針) auto e = &ci; // e 是一個指向整數常量的指針(對常量對象取地址是一種底層const)
假如願望揣摸出的auto類型是一個頂層const,須要明白指出:
const auto f = ci; // ci 的推演類型是int,f是const int類型
還可以將援用的類型設置為auto,此時本來的初始化規矩依然實用:
auto &g = ci; // g是一個整型常量援用,綁定到ci auto &h = 42; // Error: 不克不及為異常量援用綁定字面值 const auto &j = 42; // OK: 可認為常量援用綁定字面值
切記,符號*和&只附屬於某個聲明,而非根本數據類型的一部門,是以初始值必需是統一類型:
auto k = ci, &l = i; // k是整數,l是整型援用 auto &m = ci, *p = &ci; // m是對整型常量的援用,p是指向整型常量的指針 auto &n = i, *p2 = &ci; // Error: i的類型是int,而&ci的類型是const int
附上更多示例代碼:
上面的聲明等效。在第一個語句中,將變量j 聲明為類型 int。在第二個語句中,將變量 k 推導為類型 int,由於初始化表達式 (0) 是整數
int j = 0; // Variable j is explicitly type int. auto k = 0; // Variable k is implicitly type int because 0 is an integer.
以下聲明等效,但第二個聲明比第一個更簡略。應用 auto 症結字的最使人佩服的一個緣由是簡略
map<int,list<string>>::iterator i = m.begin(); auto i = m.begin();
應用 iter 和 elem 啟動輪回時
#include <deque> using namespace std; int main() { deque<double> dqDoubleData(10, 0.1); for (auto iter = dqDoubleData.begin(); iter != dqDoubleData.end(); ++iter) { /* ... */ } // prefer range-for loops with the following information in mind // (this applies to any range-for with auto, not just deque) for (auto elem : dqDoubleData) // COPIES elements, not much better than the previous examples { /* ... */ } for (auto& elem : dqDoubleData) // observes and/or modifies elements IN-PLACE { /* ... */ } for (const auto& elem : dqDoubleData) // observes elements IN-PLACE { /* ... */ } }
上面的代碼片斷應用 new 運算符和指針聲明來聲明指針
double x = 12.34; auto *y = new auto(x), **z = new auto(&x);
下一個代碼片斷在每一個聲明語句中聲明多個符號。請留意,每一個語句中的一切符號將解析為統一類型。
auto x = 1, *y = &x, **z = &y; // Resolves to int. auto a(2.01), *b (&a); // Resolves to double. auto c = 'a', *d(&c); // Resolves to char. auto m = 1, &n = m; // Resolves to int.
此代碼片斷應用前提運算符 (?:) 將變量 x 聲明為值為 200 的整數:
int v1 = 100, v2 = 200; auto x = v1 > v2 ? v1 : v2;
上面的代碼片斷將變量 x 初始化為類型 int,將變量 y初始化對類型 const int 的援用,將變量 fp 初始化為指向前往類型 int 的函數的指針。
int f(int x) { return x; } int main() { auto x = f(0); const auto & y = f(1); int (*p)(int x); p = f; auto fp = p; //... }