C++中引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字和范圍for循環(huán)詳解
一、前言
大家好久不見(jiàn),這篇文章帶大家學(xué)習(xí)一下C++中的引用和內(nèi)聯(lián)函數(shù)
二、引用
引用變量是一個(gè)別名,也就是說(shuō),它是某個(gè)已存在變量的另一個(gè)名字,舉個(gè)例子,李逵有很多外號(hào),這些外號(hào)都是指李逵這一個(gè)人,因此這些外號(hào)都是他的引用!

一旦把引用初始化為某個(gè)變量,就可以使用該引用名稱(chēng)或變量名稱(chēng)來(lái)指向變量。
在C++中,我們用int(數(shù)據(jù)類(lèi)型)& +引用名稱(chēng)(b) = 變量名稱(chēng)(a) 來(lái)表示b是a的 一個(gè) 別名,別名當(dāng)然可以有很多個(gè)!

如圖,b是a的別名,因此a和b的值、地址全部都一致。
引用與指針不同,引用必須指向已經(jīng)存在的變量,必須賦值,即不能出現(xiàn)如下寫(xiě)法:
int& b; //空引用‘b' ? int* b; //空指針'b‘ ??
引用一旦指向一個(gè)變量,就不能再指向其他變量,因?yàn)橐孟喈?dāng)于變量的別名,若更換引用,實(shí)際上是給變量賦值。

想要把b改為c的別名,但事實(shí)上,b仍然是a的別名,指向同一塊空間,只是這塊空間的值被改為了c的值
總結(jié)一下,C++中引用一共有三個(gè)特性:
- 引用在定義時(shí)必須初始化
- 一個(gè)變量可以有多個(gè)引用
- 引用一旦引用一個(gè)實(shí)體,再不能引用其他實(shí)體
引用作為一種數(shù)據(jù)類(lèi)型,是既可以作為參數(shù)傳遞,也可以作為返回值返回,我們重點(diǎn)討論一下傳值返回和傳引用返回。
??作用范圍:傳引用返回只能在空間不會(huì)隨函數(shù)結(jié)束而銷(xiāo)毀的情況,傳值返回可以函數(shù)結(jié)束銷(xiāo)毀的適合返回。
??使用效率:正是由于傳值返回返回變量的臨時(shí)拷貝,所以傳引用返回會(huì)帶來(lái)性能上的提升,但有些時(shí)候是 不可以傳引用返回的,如果你將一塊棧上的空間返回了別名,會(huì)引發(fā)嚴(yán)重的錯(cuò)誤
引用與指針功能類(lèi)似,又有很多不同:
- 引用概念上定義一個(gè)變量的別名,指針存儲(chǔ)一個(gè)變量地址。
- 引用在定義時(shí)必須初始化,指針沒(méi)有要求
- 引用在初始化時(shí)引用一個(gè)實(shí)體后,就不能再引用其他實(shí)體,而指針可以在任何時(shí)候指向任何一個(gè)同類(lèi)型實(shí)體
- 沒(méi)有NULL引用,但有NULL指針
- 在sizeof中含義不同:引用結(jié)果為引用類(lèi)型的大小,但指針始終是地址空間所占字節(jié)個(gè)數(shù)(32位平臺(tái)下占4個(gè)字節(jié))
- 引用自加即引用的實(shí)體增加1,指針自加即指針向后偏移一個(gè)類(lèi)型的大小
- 有多級(jí)指針,但是沒(méi)有多級(jí)引用
- 訪問(wèn)實(shí)體方式不同,指針需要顯式解引用,引用編譯器自己處理
- 引用比指針使用起來(lái)相對(duì)更安全
三、內(nèi)聯(lián)函數(shù)
以inline修飾的函數(shù)叫做內(nèi)聯(lián)函數(shù),編譯時(shí)C++編譯器會(huì)在調(diào)用內(nèi)聯(lián)函數(shù)的地方展開(kāi),沒(méi)有函數(shù)調(diào)用建立棧幀的開(kāi)銷(xiā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語(yǔ)言宏相似,因此也是一種空間換時(shí)間的做法,雖然能夠提高運(yùn)行效率,但會(huì)讓目標(biāo)文件變大。
與C語(yǔ)言宏不同,內(nèi)聯(lián)函數(shù)支持調(diào)試,并且可以規(guī)避C語(yǔ)言宏的一系列問(wèn)題。
#define Add(a,b) ((a)+(b))
如果上述宏少寫(xiě)括號(hào)都會(huì)引發(fā)嚴(yán)重的問(wèn)題,與乘法結(jié)合之類(lèi)的問(wèn)題就會(huì)頻出,內(nèi)聯(lián)函數(shù)很好的解決了這個(gè)問(wèn)題。
內(nèi)聯(lián)函數(shù)定義和聲明在一起!因?yàn)閕nline就沒(méi)有函數(shù)地址了,鏈接無(wú)法找到這個(gè)函數(shù)!聲明和定義都在類(lèi)中的函數(shù)也被認(rèn)為是內(nèi)聯(lián)函數(shù),因此
簡(jiǎn)短的函數(shù)適合將聲明和定義都放在類(lèi)內(nèi)聲明和定義。
四、auto關(guān)鍵字
auto是C++11新增的一個(gè)關(guān)鍵字,能夠自動(dòng)推導(dǎo)變量類(lèi)型,與C語(yǔ)言中typedef的功能類(lèi)似。

但需要注意,使用auto定義變量時(shí)必須初始化,否則無(wú)法通過(guò)編譯在編譯階段編譯器需要根據(jù)初始化表達(dá)式來(lái)推導(dǎo)auto的實(shí)際類(lèi)型。因此auto并非是一種“類(lèi)型”的聲明,而是一個(gè)類(lèi)型聲明時(shí)的“占位符”,編譯器在編譯期會(huì)將auto替換為變量實(shí)際的類(lèi)型。
auto細(xì)節(jié)說(shuō)明:
1、可以自動(dòng)推導(dǎo)出auto為指針類(lèi)型,但不能推導(dǎo)引用,因此引用類(lèi)型只能加&
auto a = &A; auto* b = &A; auto& c = A;
2、在同一行使用auto時(shí)必須保證都是同一類(lèi)型,編譯器只推導(dǎo)第一個(gè)類(lèi)型,然后將類(lèi)型給與其他變量
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)
對(duì)于有范圍的數(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)后的括號(hào)由冒號(hào)“ :”分為兩部分:第一部分是范圍內(nèi)用于迭代的變量,第二部分則表示被迭代的范圍。
需要注意的是,e是臨時(shí)變量,更改時(shí)無(wú)法改變?cè)瓟?shù)組,若要改變?cè)瓟?shù)組,可以使用引用:
for(int& e : arr) //引用
六、結(jié)語(yǔ)
到此這篇關(guān)于C++中引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字和范圍for循環(huán)的文章就介紹到這了,更多相關(guān)C++引用、內(nèi)聯(lián)函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Visual Studio 2019 Professional 激活方法詳解
這篇文章主要介紹了Visual Studio 2019 Professional 激活方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
C++實(shí)現(xiàn)LeetCode(159.最多有兩個(gè)不同字符的最長(zhǎng)子串)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(159.最多有兩個(gè)不同字符的最長(zhǎng)子串),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C語(yǔ)言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
基于Matlab實(shí)現(xiàn)水波倒影特效的制作
這篇文章主要介紹了如何利用Matlab制作出水波倒影的特效,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定幫助,需要的可以參考一下2022-03-03
C語(yǔ)言編程深入理解取整取余取模問(wèn)題示例分析
這篇文章主要為大家介紹了C語(yǔ)言編程深入理解取整取余取模問(wèn)題的示例分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
C++實(shí)現(xiàn)LeetCode(62.不同的路徑)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(62.不同的路徑),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C語(yǔ)言實(shí)現(xiàn)超市管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)超市管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07

