C++中引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字和范圍for循環(huán)詳解
一、前言
大家好久不見,這篇文章帶大家學(xué)習(xí)一下C++中的引用和內(nèi)聯(lián)函數(shù)
二、引用
引用變量是一個別名,也就是說,它是某個已存在變量的另一個名字,舉個例子,李逵有很多外號,這些外號都是指李逵這一個人,因此這些外號都是他的引用!
一旦把引用初始化為某個變量,就可以使用該引用名稱或變量名稱來指向變量。
在C++中,我們用int(數(shù)據(jù)類型)& +引用名稱(b) = 變量名稱(a) 來表示b是a的 一個 別名,別名當(dāng)然可以有很多個!
如圖,b是a的別名,因此a和b的值、地址全部都一致。
引用與指針不同,引用必須指向已經(jīng)存在的變量,必須賦值,即不能出現(xiàn)如下寫法:
int& b; //空引用‘b' ? int* b; //空指針'b‘ ??
引用一旦指向一個變量,就不能再指向其他變量,因?yàn)橐孟喈?dāng)于變量的別名,若更換引用,實(shí)際上是給變量賦值。
想要把b改為c的別名,但事實(shí)上,b仍然是a的別名,指向同一塊空間,只是這塊空間的值被改為了c的值
總結(jié)一下,C++中引用一共有三個特性:
- 引用在定義時(shí)必須初始化
- 一個變量可以有多個引用
- 引用一旦引用一個實(shí)體,再不能引用其他實(shí)體
引用作為一種數(shù)據(jù)類型,是既可以作為參數(shù)傳遞,也可以作為返回值返回,我們重點(diǎn)討論一下傳值返回和傳引用返回。
??作用范圍:傳引用返回只能在空間不會隨函數(shù)結(jié)束而銷毀的情況,傳值返回可以函數(shù)結(jié)束銷毀的適合返回。
??使用效率:正是由于傳值返回返回變量的臨時(shí)拷貝,所以傳引用返回會帶來性能上的提升,但有些時(shí)候是 不可以傳引用返回的,如果你將一塊棧上的空間返回了別名,會引發(fā)嚴(yán)重的錯誤
引用與指針功能類似,又有很多不同:
- 引用概念上定義一個變量的別名,指針存儲一個變量地址。
- 引用在定義時(shí)必須初始化,指針沒有要求
- 引用在初始化時(shí)引用一個實(shí)體后,就不能再引用其他實(shí)體,而指針可以在任何時(shí)候指向任何一個同類型實(shí)體
- 沒有NULL引用,但有NULL指針
- 在sizeof中含義不同:引用結(jié)果為引用類型的大小,但指針始終是地址空間所占字節(jié)個數(shù)(32位平臺下占4個字節(jié))
- 引用自加即引用的實(shí)體增加1,指針自加即指針向后偏移一個類型的大小
- 有多級指針,但是沒有多級引用
- 訪問實(shí)體方式不同,指針需要顯式解引用,引用編譯器自己處理
- 引用比指針使用起來相對更安全
三、內(nèi)聯(lián)函數(shù)
以inline修飾的函數(shù)叫做內(nèi)聯(lián)函數(shù),編譯時(shí)C++編譯器會在調(diào)用內(nèi)聯(lián)函數(shù)的地方展開,沒有函數(shù)調(diào)用建立棧幀的開銷,內(nèi)聯(lián)函數(shù)提升程序運(yùn)行的效率。
//內(nèi)聯(lián)函數(shù)的格式 inline int Add(int x,int y) { return x+y; }
內(nèi)聯(lián)函數(shù)與C語言宏相似,因此也是一種空間換時(shí)間的做法,雖然能夠提高運(yùn)行效率,但會讓目標(biāo)文件變大。
與C語言宏不同,內(nèi)聯(lián)函數(shù)支持調(diào)試,并且可以規(guī)避C語言宏的一系列問題。
#define Add(a,b) ((a)+(b))
如果上述宏少寫括號都會引發(fā)嚴(yán)重的問題,與乘法結(jié)合之類的問題就會頻出,內(nèi)聯(lián)函數(shù)很好的解決了這個問題。
內(nèi)聯(lián)函數(shù)定義和聲明在一起!因?yàn)閕nline就沒有函數(shù)地址了,鏈接無法找到這個函數(shù)!聲明和定義都在類中的函數(shù)也被認(rèn)為是內(nèi)聯(lián)函數(shù),因此
簡短
的函數(shù)適合將聲明和定義都放在類內(nèi)聲明和定義。
四、auto關(guān)鍵字
auto是C++11新增的一個關(guān)鍵字,能夠自動推導(dǎo)變量類型,與C語言中typedef的功能類似。
但需要注意,使用auto定義變量時(shí)必須初始化,否則無法通過編譯在編譯階段編譯器需要根據(jù)初始化表達(dá)式來推導(dǎo)auto的實(shí)際類型。因此auto并非是一種“類型”的聲明,而是一個類型聲明時(shí)的“占位符”,編譯器在編譯期會將auto替換為變量實(shí)際的類型。
auto細(xì)節(jié)說明:
1、可以自動推導(dǎo)出auto為指針類型,但不能推導(dǎo)引用,因此引用類型只能加&
auto a = &A; auto* b = &A; auto& c = A;
2、在同一行使用auto時(shí)必須保證都是同一類型,編譯器只推導(dǎo)第一個類型,然后將類型給與其他變量
auto a = 10,b=20,c=30;√ auto a = 10,b='a'; X
3、auto不能聲明數(shù)組,也不可以作為函數(shù)的參數(shù)
int func(auto x){}; X auto arr[200]; X
五、范圍for循環(huán)
對于有范圍的數(shù)組,范圍for循環(huán)能夠讓程序員更方便的遍歷數(shù)組
int arr[10] = {0,1,2,3,4,5,6,7,8,9}; for(int i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)//傳統(tǒng)for循環(huán) for(int e : arr) //范圍for循環(huán)
for循環(huán)后的括號由冒號“ :”分為兩部分:第一部分是范圍內(nèi)用于迭代的變量,第二部分則表示被迭代的范圍。
需要注意的是,e是臨時(shí)變量,更改時(shí)無法改變原數(shù)組,若要改變原數(shù)組,可以使用引用:
for(int& e : arr) //引用
六、結(jié)語
到此這篇關(guān)于C++中引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字和范圍for循環(huán)的文章就介紹到這了,更多相關(guān)C++引用、內(nèi)聯(lián)函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Visual Studio 2019 Professional 激活方法詳解
這篇文章主要介紹了Visual Studio 2019 Professional 激活方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05C++實(shí)現(xiàn)LeetCode(159.最多有兩個不同字符的最長子串)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(159.最多有兩個不同字符的最長子串),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07基于Matlab實(shí)現(xiàn)水波倒影特效的制作
這篇文章主要介紹了如何利用Matlab制作出水波倒影的特效,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Matlab有一定幫助,需要的可以參考一下2022-03-03C++實(shí)現(xiàn)LeetCode(62.不同的路徑)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(62.不同的路徑),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07