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