C++·入門·04|引用-創(chuàng)新互聯(lián)

在這里插入圖片描述
啊我摔倒了..有沒(méi)有人扶我起來(lái)學(xué)習(xí)....

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比建華網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式建華網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋建華地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。

👱個(gè)人主頁(yè): 《 C G o d 的個(gè)人主頁(yè)》 \color{Darkorange}{《CGod的個(gè)人主頁(yè)》} 《CGod的個(gè)人主頁(yè)》交個(gè)朋友叭~
💒個(gè)人社區(qū): 《編程成神技術(shù)交流社區(qū)》 \color{Darkorange}{《編程成神技術(shù)交流社區(qū)》} 《編程成神技術(shù)交流社區(qū)》加入我們,一起高效學(xué)習(xí),收割好Offer叭~
🌱刷題鏈接: 《 L e e t C o d e 》 \color{Darkorange}{《LeetCode》} 《LeetCode》快速成長(zhǎng)的渠道哦~


目錄
  • 前言
  • 一、引用特性
  • 二、常引用
  • 三、使用場(chǎng)景
    • 3.1 做參數(shù)
    • 3.2 做返回值
    • 3.3 傳值、傳引用效率比較
  • 四、引用和指針的區(qū)別
  • 五、引用和指針的不同點(diǎn)


前言
  • 引用不是新定義一個(gè)變量,而是給已存在變量取了一個(gè)別名,編譯器不會(huì)為引用變量開(kāi)辟內(nèi)存空間,它和它引用的變量共用同一塊內(nèi)存空間
  • 比如:我,名叫李波。在家我媽稱我為"波波豬",社會(huì)上人稱"波波"
  • 類型& 引用變量名(對(duì)象名) = 引用實(shí)體;
void TestRef()
{int a = 10;
    int& ra = a;//定義引用類型
    printf("%p\n", &a);
    printf("%p\n", &ra);
}

可以發(fā)現(xiàn),輸出的地址一致:在這里插入圖片描述
注意: 引用類型必須和引用實(shí)體是同種類型的,比如“波波豬”是人,并不是豬!


一、引用特性
  1. 引用在定義時(shí)必須初始化
  2. 一個(gè)變量可以有多個(gè)引用
  3. 引用一旦引用一個(gè)實(shí)體,再不能引用其他實(shí)體
void TestRef()
{int a = 10;
    // int& ra;   // 該條語(yǔ)句編譯時(shí)會(huì)出錯(cuò)
    int& ra = a;
    int& rra = a;
    printf("%p  %p  %p\n", &a, &ra, &rra);
}

輸出:在這里插入圖片描述

二、常引用
void TestConstRef()
{const int a = 10;
    //int& ra = a;   // 該語(yǔ)句編譯時(shí)會(huì)出錯(cuò),a為常量
    const int& ra = a;
    // int& b = 10;  // 該語(yǔ)句編譯時(shí)會(huì)出錯(cuò),b為常量
    const int& b = 10;
}
  • 對(duì)于以下這部分,相信鐵汁們會(huì)疑惑!
double d = 12.34;
    //int& rd = d;  // 該語(yǔ)句編譯時(shí)會(huì)出錯(cuò),類型不同
    const int& rd = d;
  • int& rd = d;類型不同不能引用是可以理解,但為啥加了個(gè)const就能了???
  • 原來(lái),表面上看的類型不同不能引用,本質(zhì)是因?yàn)轭愋娃D(zhuǎn)換的時(shí)候會(huì)產(chǎn)生臨時(shí)變量,rd引用的是這個(gè)臨時(shí)變量,而臨時(shí)變量具有常數(shù)屬性,所以才導(dǎo)致類型不同不能引用的現(xiàn)象!加個(gè)const就行啦
三、使用場(chǎng)景 3.1 做參數(shù)
void Swap(int& left, int& right)
{int temp = left;
   left = right;
   right = temp;
}

可以看出,引用可以代替指針的一些功能,且不用取地址,方便了一些

3.2 做返回值
int& Count()
{static int n = 0;
   n++;
   // ...
   return n;
}
  • 下面代碼輸出什么結(jié)果?為什么?
int& Add(int a, int b)
{int c = a + b;
    return c;
}
int main()
{int& ret = Add(1, 2);
    Add(3, 4);
    cout<< "Add(1, 2) is :"<< ret<

輸出:在這里插入圖片描述

  • 咦???不應(yīng)該是3嗎?怎么會(huì)得到Add(3,4)的值?
    在這里插入圖片描述
  • 如果對(duì)函數(shù)棧幀知識(shí)點(diǎn)比較模糊的鐵汁,可以參考博主之前的一篇文章《C · 進(jìn)階 | 函數(shù)棧幀的創(chuàng)建和銷毀》

注意: 如果函數(shù)返回時(shí),出了函數(shù)作用域,如果返回對(duì)象還在(還沒(méi)還給系統(tǒng)),則可以使用引用返回,如果已經(jīng)還給系統(tǒng)了,則必須使用傳值返回

3.3 傳值、傳引用效率比較
  • 以值作為參數(shù)或者返回值類型,在傳參和返回期間,函數(shù)不會(huì)直接傳遞實(shí)參或者將變量本身直接返回,而是傳遞實(shí)參或者返回變量的一份臨時(shí)的拷貝,因此用值作為參數(shù)或者返回值類型,效率是非常低下的,尤其是當(dāng)參數(shù)或者返回值類型非常大時(shí),效率就更低
  • 可以用以下代碼測(cè)試一下:
#includeusing namespace std;
#includestruct A {int a[10000]; };
void TestFunc1(A a) {}
void TestFunc2(A& a) {}
void TestRefAndValue()
{A a;
    // 以值作為函數(shù)參數(shù)
    size_t begin1 = clock();
    for (size_t i = 0; i< 10000; ++i)
        TestFunc1(a);
    size_t end1 = clock();
    // 以引用作為函數(shù)參數(shù)
    size_t begin2 = clock();
    for (size_t i = 0; i< 10000; ++i)
        TestFunc2(a);
    size_t end2 = clock();
    // 分別計(jì)算兩個(gè)函數(shù)運(yùn)行結(jié)束后的時(shí)間
    cout<< "TestFunc1(A)-time:"<< end1 - begin1<< endl;
    cout<< "TestFunc2(A&)-time:"<< end2 - begin2<< endl;
}
int main()
{TestRefAndValue();
    return 0;
}

輸出:在這里插入圖片描述發(fā)現(xiàn)傳值和指針在作為傳參以及返回值類型上效率相差很大

四、引用和指針的區(qū)別
  • 在語(yǔ)法概念上引用就是一個(gè)別名,沒(méi)有獨(dú)立空間,和其引用實(shí)體共用同一塊空間
int main()
{int a = 10;
	int& ra = a;

	cout<< "&a = "<< &a<< endl;
	cout<< "&ra = "<< &ra<< endl;
	return 0;
}

輸出:在這里插入圖片描述

  • 在底層實(shí)現(xiàn)上實(shí)際是有空間的,因?yàn)橐檬前凑罩羔樂(lè)绞絹?lái)實(shí)現(xiàn)的
int main()
{int a = 10;

	int& ra = a;
	ra = 20;

	int* pa = &a;
	*pa = 20;

	return 0;
}

我們來(lái)看下引用和指針的匯編代碼對(duì)比:在這里插入圖片描述

五、引用和指針的不同點(diǎn)
  1. 引用概念上定義一個(gè)變量的別名,指針存儲(chǔ)一個(gè)變量地址。
  2. 引用在定義時(shí)必須初始化,指針沒(méi)有要求
  3. 引用在初始化時(shí)引用一個(gè)實(shí)體后,就不能再引用其他實(shí)體,而指針可以在任何時(shí)候指向任何一個(gè)同類型實(shí)體
  4. 沒(méi)有NULL引用,但有NULL指針
  5. 在sizeof中含義不同:引用結(jié)果為引用類型的大小,但指針始終是地址空間所占字節(jié)個(gè)數(shù)(32位平臺(tái)下占4個(gè)字節(jié))
  6. 引用自加即引用的實(shí)體增加1,指針自加即指針向后偏移一個(gè)類型的大小
  7. 有多級(jí)指針,但是沒(méi)有多級(jí)引用
  8. 訪問(wèn)實(shí)體方式不同,指針需要顯式解引用,引用編譯器自己處理
  9. 引用比指針使用起來(lái)相對(duì)更安全

在這里插入圖片描述

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)站欄目:C++·入門·04|引用-創(chuàng)新互聯(lián)
文章起源:http://www.muchs.cn/article0/peeoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、網(wǎng)站設(shè)計(jì)公司ChatGPT、網(wǎng)站策劃網(wǎng)站排名、標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)