您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“C++中引用的知識(shí)點(diǎn)有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“C++中引用的知識(shí)點(diǎn)有哪些”吧!
引用不是新定義一個(gè)變量,而是給已存在變量取了一個(gè)別名,編譯器不會(huì)為引用變量開辟內(nèi)存空間,它和它引用的變量共用同一塊內(nèi)存空間。
比如:李逵,在家稱為"鐵牛",江湖上人稱"黑旋風(fēng)"。那么這里的“鐵?!薄ⅰ昂谛L(fēng)”就稱李逵的引用。
在程序中呢,引用的用法如下:
類型& 引用變量名(對(duì)象名) = 引用實(shí)體;
舉個(gè)例子:
void TestRef() { int a = 10; int& ra = a;//<====定義引用類型 printf("%p\n", &a); //打印出a的地址 printf("%p\n", &ra); //打印出ra的地址 }
結(jié)果如下:
其中ra為a的引用,可見 a 和 ra 的地址一樣,這就說明了變量與變量的引用公用的一塊內(nèi)存空間。
特別注意:引用類型必須和引用實(shí)體是同種類型的
1. 引用在定義時(shí)必須初始化
2. 一個(gè)變量可以有多個(gè)引用
3. 引用一旦引用一個(gè)實(shí)體,再不能引用其他實(shí)體
例如:
void TestRef() { int a = 10; // int& ra; // 該條語句編譯時(shí)會(huì)出錯(cuò),因?yàn)闆]有初始化 int& ra = a; int& rra = a; printf("%p %p %p\n", &a, &ra, &rra); }
知道引用的特性后,我們就可以簡化在C語言中一些簡單函數(shù)的寫法,如交換兩個(gè)數(shù),可直接傳變量的引用為參數(shù)來實(shí)現(xiàn),具體如下:
可見當(dāng)傳入的參數(shù)為變量的引用時(shí),就可以避免在次開辟內(nèi)存空間,一定程度上提高了代碼運(yùn)行效率。
所謂常引用就是在一個(gè)變量的引用前加一個(gè)關(guān)鍵字 const 來使這個(gè)引用具有常量的性質(zhì)。
如下所示:
void TestConstRef() { const int a = 10; //int& ra = a; // 該語句編譯時(shí)會(huì)出錯(cuò),因?yàn)閍為常量,而ra為變量(由&前面的類型決定,為int變量類型) const int& ra = a; // int& b = 10; // 該語句編譯時(shí)會(huì)出錯(cuò),b為常量 const int& b = 10; double d = 12.34; //int& rd = d; // 該語句編譯時(shí)會(huì)出錯(cuò),類型不同 const int& rd = d; }
再例如:
int main() { int i = 10; double d = i; //double& r=i; //這里編譯器會(huì)報(bào)錯(cuò),具體原因如下圖示 const double& r = i; //加上const 修飾就會(huì)使引用具有常性 return 0; }
所以只有在定義引用前加上const 修飾就能使之具有常性。
另外要注意使用const引用時(shí)的權(quán)限問題,例如:
#include<iostream> using namespace std; int main() { // 使用常變量時(shí)變成常變量的別名的條件:不變或者縮小常變量的讀寫權(quán)限是可以的, //放大你常變量讀寫權(quán)限不行的 const int a = 10; // int& b = a; // 不能這樣定義b,這樣會(huì)使a的權(quán)限變大,編譯器會(huì)報(bào)錯(cuò) int c = 20; const int& d = c; // 可以這樣定義,d變成的c的別名,d不能修改c,相當(dāng)于把c的權(quán)限縮小 //其中c是可以改變的,但是d只能讀不能寫 return 0; }
如上解釋一下:并不是每個(gè)別名(即引用)都跟原名字有一樣的權(quán)限,具體要看怎么修飾。
1、做參數(shù)
void Swap(int& left, int& right) { int temp = left; left = right; right = temp; }
這里提一下引用做參數(shù)的優(yōu)點(diǎn):
1、 傳引用是為了減少傳值傳參時(shí)的拷貝
2、使用const修飾引用時(shí)可以保護(hù)形參不會(huì)被改變
3、const引用做參數(shù)時(shí),即可接收變量,也可以接收常量
總的來說,函數(shù)傳參如果想減少拷貝就用引用傳參,如果函數(shù)中不改變這個(gè)參數(shù)最好用const 引用傳參
2、做返回值
看如下栗子:
為什么打印出的 ret=7 呢?
這是因?yàn)楹瘮?shù)的返回類型為 int& ,所以返回值 c 的類型就是 int&,而 ret 作為接收函數(shù)的返回值的量,也為 int& 型,所以在這里就可以把 ret 看做是 c 的別名,當(dāng)程序來到 Add(3,4); 這條語句時(shí),返回值 c 就變?yōu)榱?7,所以此時(shí)的 ret 的值也就為7。
以上也說明了使用引用做返回值會(huì)有一定的風(fēng)險(xiǎn)性。
最后來總結(jié)一下引用與指針的區(qū)別。
在語法概念上引用就是一個(gè)別名,沒有獨(dú)立空間,和其引用實(shí)體共用同一塊空間。在底層實(shí)現(xiàn)上實(shí)際是有空間的,因?yàn)橐檬前凑罩羔樂绞絹韺?shí)現(xiàn)的。
來看這樣一段代碼:
int main() { int a = 10; int& ra = a; ra = 20; int* pa = &a; *pa = 20; return 0; }
再查看其匯編代碼,會(huì)發(fā)現(xiàn)引用與指針的實(shí)現(xiàn)方式是一樣的。
引用與指針的不同點(diǎn):
1.引用在定義時(shí)必須初始化,指針沒有要求
2. 引用在初始化時(shí)引用一個(gè)實(shí)體后,就不能再引用其他實(shí)體,而指針可以在任何時(shí)候指向任何一個(gè)同類型實(shí)體
3. 沒有NULL引用,但有NULL指針
4. 在sizeof中含義不同:引用結(jié)果為引用類型的大小,但指針始終是地址空間所占字節(jié)個(gè)數(shù)(32位平臺(tái)下占4個(gè)字節(jié))
5. 引用自加即引用的實(shí)體增加1,指針自加即指針向后偏移一個(gè)類型的大小
6. 有多級(jí)指針,但是沒有多級(jí)引用
7. 訪問實(shí)體方式不同,指針需要顯式解引用,引用編譯器自己處理
8. 引用比指針使用起來相對(duì)更安全(因?yàn)橹羔樖褂貌簧骶蜁?huì)造成野指針)
到此,相信大家對(duì)“C++中引用的知識(shí)點(diǎn)有哪些”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。