欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中引用的相關(guān)知識(shí)點(diǎn)小結(jié)

 更新時(shí)間:2022年03月02日 12:23:11   作者:Chaser?Feng  
引用是C++一個(gè)很重要的特性,顧名思義是某一個(gè)變量或?qū)ο蟮膭e名,對(duì)引用的操作與對(duì)其所綁定的變量或?qū)ο蟮牟僮魍耆葍r(jià),這篇文章主要給大家總結(jié)介紹了C++中引用的相關(guān)知識(shí)點(diǎn),需要的朋友可以參考下

引用的概念

引用不是新定義一個(gè)變量,而是給已存在變量取了一個(gè)別名,編譯器不會(huì)為引用變量開(kāi)辟內(nèi)存空間,它和它引用的變量共用同一塊內(nèi)存空間。

比如:李逵,在家稱為"鐵牛",江湖上人稱"黑旋風(fēng)"。那么這里的“鐵牛”、“黑旋風(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的引用,可見(jiàn) a 和 ra 的地址一樣,這就說(shuō)明了變量與變量的引用公用的一塊內(nèi)存空間。

特別注意:引用類型必須和引用實(shí)體是同種類型的

引用特性

1. 引用在定義時(shí)必須初始化

2. 一個(gè)變量可以有多個(gè)引用

3. 引用一旦引用一個(gè)實(shí)體,再不能引用其他實(shí)體

例如:

void TestRef()
{
	int a = 10;
	// int& ra; // 該條語(yǔ)句編譯時(shí)會(huì)出錯(cuò),因?yàn)闆](méi)有初始化
	int& ra = a;
	int& rra = a;
	printf("%p %p %p\n", &a, &ra, &rra);
}

知道引用的特性后,我們就可以簡(jiǎn)化在C語(yǔ)言中一些簡(jiǎn)單函數(shù)的寫法,如交換兩個(gè)數(shù),可直接傳變量的引用為參數(shù)來(lái)實(shí)現(xiàn),具體如下:

可見(jiàn)當(dāng)傳入的參數(shù)為變量的引用時(shí),就可以避免在次開(kāi)辟內(nèi)存空間,一定程度上提高了代碼運(yùn)行效率。

常引用

所謂常引用就是在一個(gè)變量的引用前加一個(gè)關(guān)鍵字 const 來(lái)使這個(gè)引用具有常量的性質(zhì)。

如下所示:

void TestConstRef()
{
const int a = 10;
//int& ra = a; // 該語(yǔ)句編譯時(shí)會(huì)出錯(cuò),因?yàn)閍為常量,而ra為變量(由&前面的類型決定,為int變量類型)
const int& ra = a;
// int& b = 10; // 該語(yǔ)句編譯時(shí)會(huì)出錯(cuò),b為常量
const int& b = 10;
double d = 12.34;
//int& rd = d; // 該語(yǔ)句編譯時(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)限問(wè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)限,具體要看怎么修飾。

使用場(chǎng)景

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í),即可接收變量,也可以接收常量
 

總的來(lái)說(shuō),函數(shù)傳參如果想減少拷貝就用引用傳參,如果函數(shù)中不改變這個(gè)參數(shù)最好用const 引用傳參

2、做返回值

看如下栗子:

為什么打印出的 ret=7 呢?

這是因?yàn)楹瘮?shù)的返回類型為 int& ,所以返回值 c 的類型就是 int&,而 ret 作為接收函數(shù)的返回值的量,也為 int& 型,所以在這里就可以把 ret 看做是 c 的別名,當(dāng)程序來(lái)到 Add(3,4); 這條語(yǔ)句時(shí),返回值 c 就變?yōu)榱?7,所以此時(shí)的 ret 的值也就為7。

以上也說(shuō)明了使用引用做返回值會(huì)有一定的風(fēng)險(xiǎn)性。

引用和指針的區(qū)別

最后來(lái)總結(jié)一下引用與指針的區(qū)別。

在語(yǔ)法概念上引用就是一個(gè)別名,沒(méi)有獨(dú)立空間,和其引用實(shí)體共用同一塊空間。在底層實(shí)現(xiàn)上實(shí)際是有空間的,因?yàn)橐檬前凑罩羔樂(lè)绞絹?lái)實(shí)現(xiàn)的。

來(lái)看這樣一段代碼:

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í)必須初始化,指針沒(méi)有要求

2. 引用在初始化時(shí)引用一個(gè)實(shí)體后,就不能再引用其他實(shí)體,而指針可以在任何時(shí)候指向任何一個(gè)同類型實(shí)體

3. 沒(méi)有NULL引用,但有NULL指針

4. 在sizeof中含義不同:引用結(jié)果為引用類型的大小,但指針始終是地址空間所占字節(jié)個(gè)數(shù)(32位平臺(tái)下占4個(gè)字節(jié))

5. 引用自加即引用的實(shí)體增加1,指針自加即指針向后偏移一個(gè)類型的大小

6. 有多級(jí)指針,但是沒(méi)有多級(jí)引用

7. 訪問(wèn)實(shí)體方式不同,指針需要顯式解引用,引用編譯器自己處理

8. 引用比指針使用起來(lái)相對(duì)更安全(因?yàn)橹羔樖褂貌簧骶蜁?huì)造成野指針)

總結(jié)

到此這篇關(guān)于C++中引用的相關(guān)知識(shí)點(diǎn)的文章就介紹到這了,更多相關(guān)C++中引用知識(shí)點(diǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言 文件的打開(kāi)與關(guān)閉詳解及示例代碼

    C語(yǔ)言 文件的打開(kāi)與關(guān)閉詳解及示例代碼

    本文主要介紹C語(yǔ)言 文件的基礎(chǔ)知識(shí),這里整理了相關(guān)資料及示例代碼,有興趣的小伙伴可以參考下
    2016-08-08
  • C語(yǔ)言中printf的兩種輸出對(duì)齊方式

    C語(yǔ)言中printf的兩種輸出對(duì)齊方式

    C語(yǔ)言中左對(duì)齊是C語(yǔ)言的默認(rèn)輸出方式,右對(duì)齊是一種特殊的輸出方式,左對(duì)齊和右對(duì)齊都對(duì)應(yīng)著一個(gè)已知的輸出寬度,輸出的字符串根據(jù)字符串的長(zhǎng)度在寬度上進(jìn)行補(bǔ)充,補(bǔ)充字符是空格,在使用printf函數(shù)輸出時(shí),需要在格式字符串中使用%-*s和%*s的格式來(lái)分別表示
    2024-02-02
  • VC++6.0實(shí)現(xiàn)直線掃描轉(zhuǎn)換的圖文教程

    VC++6.0實(shí)現(xiàn)直線掃描轉(zhuǎn)換的圖文教程

    這篇文章主要給大家介紹了關(guān)于VC++6.0實(shí)現(xiàn)直線掃描轉(zhuǎn)換的相關(guān)資料,文中通過(guò)圖文將實(shí)現(xiàn)的步驟一步步介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用VC++6.0具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-01-01
  • C語(yǔ)言以數(shù)據(jù)塊的形式讀寫文件實(shí)例代碼

    C語(yǔ)言以數(shù)據(jù)塊的形式讀寫文件實(shí)例代碼

    本文主要介紹C語(yǔ)言中以數(shù)據(jù)塊的形式讀寫文件,這里提供了實(shí)例代碼舉例說(shuō)明,有需要的小伙伴可以參考下
    2016-07-07
  • C++中的RTTI機(jī)制詳解

    C++中的RTTI機(jī)制詳解

    這篇文章主要介紹了C++中的RTTI機(jī)制詳解,本文詳細(xì)的總結(jié)了RTTI的相關(guān)知識(shí),需要的朋友可以參考下
    2014-10-10
  • C語(yǔ)言中不定參數(shù)?...?的語(yǔ)法以及函數(shù)封裝

    C語(yǔ)言中不定參數(shù)?...?的語(yǔ)法以及函數(shù)封裝

    不定參數(shù)是指函數(shù)可以接收不確定個(gè)數(shù)的參數(shù),下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中不定參數(shù)?...?的語(yǔ)法以及函數(shù)封裝的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • c++中數(shù)字與字符串之間的轉(zhuǎn)換方法(推薦)

    c++中數(shù)字與字符串之間的轉(zhuǎn)換方法(推薦)

    下面小編就為大家?guī)?lái)一篇c++中數(shù)字與字符串之間的轉(zhuǎn)換方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • C++中的HTTP協(xié)議問(wèn)題

    C++中的HTTP協(xié)議問(wèn)題

    這篇文章主要介紹了C++中的HTTP協(xié)議問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • C++相交鏈表和反轉(zhuǎn)鏈表詳解

    C++相交鏈表和反轉(zhuǎn)鏈表詳解

    這篇文章主要介紹了C++相交鏈表和反轉(zhuǎn)鏈表,結(jié)合實(shí)例形式分析了C++相交鏈表和反轉(zhuǎn)鏈表的原理、實(shí)現(xiàn)方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2021-08-08
  • C/C++通過(guò)HTTP實(shí)現(xiàn)文件上傳與下載的示例詳解

    C/C++通過(guò)HTTP實(shí)現(xiàn)文件上傳與下載的示例詳解

    WinInet是 Microsoft Windows 操作系統(tǒng)中的一個(gè) API 集,用于提供對(duì) Internet 相關(guān)功能的支持,它包括了一系列的函數(shù),使得 Windows 應(yīng)用程序能夠進(jìn)行網(wǎng)絡(luò)通信、處理 HTTP 請(qǐng)求、FTP 操作等,本文給大家介紹了C/C++通過(guò)HTTP實(shí)現(xiàn)文件上傳與下載,需要的朋友可以參考下
    2023-12-12

最新評(píng)論