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