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