【小白学习C++ 教程】二十、C++ 中的auto关键字
@Author: Runsen
在 C++ 11 之前,每種數據類型都需要在編譯時顯式聲明,在運行時限制表達式的值,但在 C++ 新版本之后,包含了許多關鍵字,允許程序員將類型推導留給編譯器本身。
有了類型推斷功能,我們可以花更少的時間寫出編譯器已經知道的東西。由于所有類型都是在編譯階段推導出來的,編譯時間略有增加,但不影響程序的運行時間。
auto 關鍵字
auto 關鍵字指定正在聲明的變量的類型將自動從其初始值設定項中扣除。對于函數,如果它們的返回類型是 auto,那么它將在運行時由返回類型表達式求值。
用 auto 關鍵字聲明的變量只能在聲明時初始化,否則會出現編譯時錯誤
例如:
auto c = a(int)+ b(double)在上面的代碼段中,a是整型,b是雙精度型,那么通過編譯器的分析,c就被定義成了雙精度型。
#include <bits/stdc++.h> using namespace std;int main() {auto x = 4;auto y = 3.37;auto ptr = &x;cout << typeid(x).name() << endl<< typeid(y).name() << endl<< typeid(ptr).name() << endl;return 0; }輸出
i d Pi使用 typeid 來獲取變量的類型。typeid 是一個運算符,用于需要知道對象的動態類型的地方。typeid(x).name() 返回 x 數據類型的簡寫名稱,例如,它返回 i 表示整數,d 表示雙精度,Pi表示整數指針等。但返回的實際名稱主要取決于編譯器。
auto 的一個很好的用途是在為容器創建迭代器時避免長時間的初始化。
#include <iostream> #include <set> using namespace std; int main() {// Create a set of stringsset<string> st;st.insert({ "runsen", "is","22" });for (auto it = st.begin();it != st.end(); it++)cout << *it << " ";return 0; }輸出
22 is runsen對于有序STL,輸出是有順的
#include <iostream> #include <vector> using namespace std; int main() {vector<int> st;st.push_back(1);st.push_back(2);st.push_back(3);for(auto it = st.begin() ; it != st.end();it++ )cout << *it << endl;return 0; }輸出
1 2 3接下來,看一下 auto 和 const 的結合:
int x = 0; const auto n = x; //n 為 const int ,auto 被推導為 int auto f = n; //f 為 const int,auto 被推導為 int(const 屬性被拋棄) const auto &r1 = x; //r1 為 const int& 類型,auto 被推導為 int auto &r2 = r1; //r1 為 const int& 類型,auto 被推導為 const int 類型下面我們來解釋一下:
-
第 2 行代碼中,n 為 const int,auto 被推導為 int。
-
第 3 行代碼中,n 為 const int 類型,但是 auto 卻被推導為 int 類型,這說明當=右邊的表達式帶有 const 屬性時, auto 不會使用 const 屬性,而是直接推導出 non-const 類型。
-
第 4 行代碼中,auto 被推導為 int 類型,這個很容易理解,不再贅述。
-
第 5 行代碼中,r1 是 const int & 類型,auto 也被推導為 const int 類型,這說明當 const 和引用結合時,auto 的推導將保留表達式的 const 類型。
**auto一般會忽略掉頂層const,但底層const會被保留下來,**比如當初始值是一個指向常量的指針時:
- int i = 0;
- const int ci = i, &cr = ci; //ci 為整數常量,cr 為整數常量引用 auto a = ci; // a 為一個整數, 頂層const被忽略
- auto b = cr; // b 為一個整數,頂層const被忽略
- auto c = &ci; // c 為一個整數指針.
- auto d = &cr; // d 為一個指向整數常量的指針(對常量對象區地址是那么const會變成底層const)
如果想編譯器推斷出的是一個頂層的const類型,需要進行明確說明:
const auto f = ci;
總結
以上是生活随笔為你收集整理的【小白学习C++ 教程】二十、C++ 中的auto关键字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剑指 Offer 03——10
- 下一篇: 8寸戚风蛋糕面粉要多少面粉?