【小白学习C++ 教程】二十、C++ 中的auto关键字
@Author: Runsen
在 C++ 11 之前,每種數(shù)據(jù)類型都需要在編譯時顯式聲明,在運行時限制表達式的值,但在 C++ 新版本之后,包含了許多關(guān)鍵字,允許程序員將類型推導(dǎo)留給編譯器本身。
有了類型推斷功能,我們可以花更少的時間寫出編譯器已經(jīng)知道的東西。由于所有類型都是在編譯階段推導(dǎo)出來的,編譯時間略有增加,但不影響程序的運行時間。
auto 關(guān)鍵字
auto 關(guān)鍵字指定正在聲明的變量的類型將自動從其初始值設(shè)定項中扣除。對于函數(shù),如果它們的返回類型是 auto,那么它將在運行時由返回類型表達式求值。
用 auto 關(guān)鍵字聲明的變量只能在聲明時初始化,否則會出現(xiàn)編譯時錯誤
例如:
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 是一個運算符,用于需要知道對象的動態(tài)類型的地方。typeid(x).name() 返回 x 數(shù)據(jù)類型的簡寫名稱,例如,它返回 i 表示整數(shù),d 表示雙精度,Pi表示整數(shù)指針等。但返回的實際名稱主要取決于編譯器。
auto 的一個很好的用途是在為容器創(chuàng)建迭代器時避免長時間的初始化。
#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 的結(jié)合:
int x = 0; const auto n = x; //n 為 const int ,auto 被推導(dǎo)為 int auto f = n; //f 為 const int,auto 被推導(dǎo)為 int(const 屬性被拋棄) const auto &r1 = x; //r1 為 const int& 類型,auto 被推導(dǎo)為 int auto &r2 = r1; //r1 為 const int& 類型,auto 被推導(dǎo)為 const int 類型下面我們來解釋一下:
-
第 2 行代碼中,n 為 const int,auto 被推導(dǎo)為 int。
-
第 3 行代碼中,n 為 const int 類型,但是 auto 卻被推導(dǎo)為 int 類型,這說明當(dāng)=右邊的表達式帶有 const 屬性時, auto 不會使用 const 屬性,而是直接推導(dǎo)出 non-const 類型。
-
第 4 行代碼中,auto 被推導(dǎo)為 int 類型,這個很容易理解,不再贅述。
-
第 5 行代碼中,r1 是 const int & 類型,auto 也被推導(dǎo)為 const int 類型,這說明當(dāng) const 和引用結(jié)合時,auto 的推導(dǎo)將保留表達式的 const 類型。
**auto一般會忽略掉頂層const,但底層const會被保留下來,**比如當(dāng)初始值是一個指向常量的指針時:
- int i = 0;
- const int ci = i, &cr = ci; //ci 為整數(shù)常量,cr 為整數(shù)常量引用 auto a = ci; // a 為一個整數(shù), 頂層const被忽略
- auto b = cr; // b 為一個整數(shù),頂層const被忽略
- auto c = &ci; // c 為一個整數(shù)指針.
- auto d = &cr; // d 為一個指向整數(shù)常量的指針(對常量對象區(qū)地址是那么const會變成底層const)
如果想編譯器推斷出的是一個頂層的const類型,需要進行明確說明:
const auto f = ci;
總結(jié)
以上是生活随笔為你收集整理的【小白学习C++ 教程】二十、C++ 中的auto关键字的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剑指 Offer 03——10
- 下一篇: 【小白学习C++ 教程】二十一、C++