C++ auto自動(dòng)類型推導(dǎo)規(guī)則和使用詳解
一.auto推導(dǎo)規(guī)則4點(diǎn)
(1) 引用不是類型,因此auto不能推斷出引用
int a = 1; int& b = a;// b-> int& 用->表示推導(dǎo)出類型,下同 auto c = b;// c->int
(2)auto 在推斷引用的類型時(shí),會(huì)直接將引用替換為引用指向的對象。
引用不是對象,任何引用的地方都可以直接替換為引用指向的對象。
int a = 10; const int& b = a ;// b-> const int& auto c = b; // c-> int //相當(dāng)于 auto c = a;
由于在傳遞值時(shí),修改這個(gè)值不會(huì)對原有的數(shù)據(jù)造成影響,而傳遞引用時(shí),修改這個(gè)值會(huì)對修改原有的數(shù)據(jù)。
(3)auto 關(guān)鍵字推斷類型時(shí),如果沒有引用符號(hào),那么會(huì)忽略值類型的const修飾,而保留修飾指向?qū)ο蟮腸onst
const int i =1; auto j = i;//j-> int int a ; const int* const pi = &a;//第一個(gè)const 修飾指針的指向的對象,第二個(gè)const修飾pi指向的值。 //會(huì)忽略第二個(gè)const。 auto pi2 = pi; // pi2 -> int* const
(4)如果有引用符號(hào),那么值類型的const和指向的const都會(huì)保留。
int i = 1; const int* const j = &i; auto &k = j; //a->const int const &
具體推導(dǎo)例子:
int x = 10;
推導(dǎo)表達(dá)式: | 推導(dǎo)出變量數(shù)據(jù)類型: | auto被推導(dǎo)的類型: | |
1 | auto *a = &x; | a 被推導(dǎo)為 :int * | auto 推導(dǎo)為: int |
2 | auto b = &x; | b 被推導(dǎo)為: int* | auto 推導(dǎo)為: int * |
3 | auto &c = x ; | c 被推導(dǎo)為: int& | auto 推導(dǎo)為: int |
4 | auto d = c; | d 被推導(dǎo)為: int | auto 推導(dǎo)為: int |
5 | const auto e= x; | e 被推導(dǎo)為: const int | auto 推導(dǎo)為: int |
6 | auto f = e; | f 被推導(dǎo)為: int | auto 推導(dǎo)為: int |
7 | const auto& g = x; | g 被推導(dǎo)為: const int& | auto 推導(dǎo)為: int |
8 | auto& h = g; | h 被推導(dǎo)為:const int& | auto 推導(dǎo)為: int |
注意: auto聲明的變量必須馬上初始化,因?yàn)樵诰幾g階段編譯器就將其類型推導(dǎo)出來。
auto a;error
二.auto的使用時(shí)機(jī)
(1)用于推導(dǎo)容器的迭代器:
原本不使用類型推導(dǎo)我們對容器的遍歷:
for(vector<int>::iterator it = vec.begin(); it! = vec.end(); it++) { cout<<"vec:"<< *it <<endl; }
使用auto自動(dòng)類型推導(dǎo)后對容器的遍歷:
for(auto it = vec.begin(); it! = vec.end(); it++ ) { cout>>"vec:"<<*it<<endl; }
是不是清爽了很多,利用auto自動(dòng)類型推導(dǎo),就不需要寫一堆迭代器類型了。
(2)書寫泛性函數(shù)
不知道程序使用時(shí),傳入的參數(shù)是什么類型時(shí),用auto可以為我們節(jié)省不少工作量。
(3)用于函數(shù)的返回值類型后置:
和decltypr配合使用,在后文講述。
到此這篇關(guān)于C++ auto自動(dòng)類型推導(dǎo)規(guī)則和使用詳解的文章就介紹到這了,更多相關(guān)C++自動(dòng)類型推導(dǎo)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++設(shè)計(jì)模式之裝飾模式(Decorator)
這篇文章主要為大家詳細(xì)介紹了C++設(shè)計(jì)模式之裝飾模式Decorator的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03C語言動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn)
本文主要介紹了C語言動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08C語言實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換函數(shù)的實(shí)例詳解
這篇文章主要介紹了C語言實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換函數(shù)的實(shí)例詳解的相關(guān)資料,這里提供實(shí)現(xiàn)實(shí)例幫助大家實(shí)現(xiàn)改功能,需要的朋友可以參考下2017-08-08CMake語法及CMakeList.txt簡單使用小結(jié)
Cmake主要用于開發(fā)跨平臺(tái)的C++項(xiàng)目,本文主要介紹了CMake語法及CMakeList.txt簡單使用小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2022-05-05