引用就是別名,如下,rnum是num的別人,對(duì)rnum的操作實(shí)際就是對(duì)num的操作。這里的&是引用運(yùn)算符,不是取址運(yùn)算符。
intnum=1; int&rnum=num;
還可以定義一個(gè)對(duì)象的別名,如下,注意不能定義一個(gè)類的別名,因?yàn)樗鼪](méi)有具體的內(nèi)存地址。
HumanMike; Human&rMike=Mike;
還要注意一點(diǎn)是,定義引用時(shí)一定要同時(shí)對(duì)該引用進(jìn)行初始化。
函數(shù)的參數(shù)傳遞有三種方式:
(1)通過(guò)值來(lái)傳遞函數(shù)參數(shù)
當(dāng)通過(guò)值的方式給函數(shù)傳遞參數(shù)時(shí),編譯器會(huì)自動(dòng)在棧中創(chuàng)建該參數(shù)的拷貝,因此,函數(shù)處理的是這些副本,一旦函數(shù)執(zhí)行完畢,副本就被釋放,原來(lái)的參數(shù)未被修改。
voidswap(inta,intb);//聲明 swap(a,b);//調(diào)用
(2)通過(guò)指針來(lái)傳遞函數(shù)參數(shù)
當(dāng)通過(guò)指針的方式給函數(shù)傳遞參數(shù)時(shí),實(shí)際上傳遞的是參數(shù)的內(nèi)存地址,而無(wú)需在棧中創(chuàng)建參數(shù)的拷貝,因此是對(duì)參數(shù)自身的參數(shù)。
voidswap(int*a,int*b);//聲明 swap(&a,&b);//調(diào)用
(3)通過(guò)引用來(lái)傳遞函數(shù)參數(shù)
對(duì)比于指針的間接訪問(wèn),采用引用的方式可以直接訪問(wèn)內(nèi)存地址。另外,使用別名的方式傳遞參數(shù)比用指針傳遞更加方便和清晰,并且具有指針的功能。
voidswap(int&ra,int&rb);//聲明 swap(a,b);//調(diào)用
傳遞對(duì)象的方式有四種:
(1)用值來(lái)傳遞對(duì)象
假如僅僅是傳遞變量的話,采用指針或引用這種按址傳遞方式的優(yōu)勢(shì)不是很明顯,但假如是傳遞較大的對(duì)象的話,則優(yōu)勢(shì)比較明顯。這是因?yàn)榘粗捣绞较蚝瘮?shù)傳遞一個(gè)對(duì)象時(shí),會(huì)建立該對(duì)象的拷貝,而從函數(shù)返回一個(gè)對(duì)象時(shí)也要建立被返回對(duì)象的拷貝。測(cè)試代碼如下:
#include
輸出結(jié)果:
執(zhí)行構(gòu)造函數(shù)創(chuàng)建一個(gè)對(duì)象 執(zhí)行復(fù)制構(gòu)造函數(shù)創(chuàng)建該對(duì)象的副本 執(zhí)行復(fù)制構(gòu)造函數(shù)創(chuàng)建該對(duì)象的副本 執(zhí)行析構(gòu)函數(shù)刪除該對(duì)象 執(zhí)行析構(gòu)函數(shù)刪除該對(duì)象 執(zhí)行析構(gòu)函數(shù)刪除該對(duì)象
(2)用指針來(lái)傳遞對(duì)象
測(cè)試代碼如下:
#include
輸出結(jié)果:
執(zhí)行構(gòu)造函數(shù)創(chuàng)建一個(gè)對(duì)象
(3)用const指針來(lái)傳遞對(duì)象
采用指針來(lái)傳遞對(duì)象,雖然可以避免調(diào)用復(fù)制構(gòu)造函數(shù)和析構(gòu)函數(shù),但由于它得到了該對(duì)象的內(nèi)存地址,可以隨時(shí)修改對(duì)象的數(shù)據(jù),因此它破壞了按值傳遞的保護(hù)機(jī)制。如果用const指針來(lái)傳遞對(duì)象,就可以防止任何試圖對(duì)該對(duì)象所進(jìn)行的操作行為,并且保證返回一個(gè)不被修改的對(duì)象。測(cè)試代碼如下:
#include
輸出結(jié)果:
執(zhí)行構(gòu)造函數(shù)創(chuàng)建一個(gè)對(duì)象 99
(4)用引用來(lái)傳遞對(duì)象
由于引用不能重新分配去引用另一個(gè)對(duì)象,它始終是常量。測(cè)試代碼如下:
#include
輸出結(jié)果:
執(zhí)行構(gòu)造函數(shù)創(chuàng)建一個(gè)對(duì)象 99
引用不但實(shí)現(xiàn)了指針的功能,而且使用起來(lái)更加方便,那為什么還要指針?因?yàn)橹羔樋梢詾榭眨貌荒転榭眨羔樋梢员毁x值,引用只可以被初始化,不可以被賦為另一個(gè)對(duì)象的別名。如果想使一個(gè)變量記錄不同對(duì)象的地址,就必須使用指針。要明白的一點(diǎn)是不可以直接用引用來(lái)指向堆中新建的空間,引用只是個(gè)別名,不可以作為指針來(lái)使用。如int &r=new int;是錯(cuò)誤的。
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4374瀏覽量
64401 -
C++
+關(guān)注
關(guān)注
22文章
2117瀏覽量
74879
原文標(biāo)題:【博文連載】C++中的“引用”
文章出處:【微信號(hào):ChinaAET,微信公眾號(hào):電子技術(shù)應(yīng)用ChinaAET】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
C++避坑指南
如何在C++中包含C代碼?
c引用和指針的區(qū)別

如何從C轉(zhuǎn)向C++ Effective C++ PDF中文版教材免費(fèi)下載
Visual C++教程之C++的語(yǔ)言資料概述免費(fèi)下載

C++中的const和引用的討論
C++基礎(chǔ)語(yǔ)法中的引用、封裝和多態(tài)
適合具備 C 語(yǔ)言基礎(chǔ)的 C++ 入門教程(二)

c++引用詳細(xì)解說(shuō)1

c++引用詳細(xì)解說(shuō)2

c++引用詳細(xì)解說(shuō)3

c++引用詳細(xì)解說(shuō)4

評(píng)論