深入理解 引用

2021-06-01 06:31:02 字數 1992 閱讀 3779

引用簡介

引用就是某一變數(目標)的乙個別名,對引用的操作和對變數直接操作完全相同。

引用的宣告方法:型別識別符號 &引用名=目標變數名;

【例1】:int a; int &ra=a; //定義引用ra,他是變數a的引用,即別名

說明:(1)&在此不是求位址運算,而是起標識作用。

(2)型別識別符號是指目標變數的型別。

(3)宣告引用時,必須同時對其進行初始化。

(4)引用宣告完畢後,相當於目標變數名有兩個名稱,即該目標原名稱和引用名,且不能再把該引用名作為其他變數名的別名。

ra=1; 等價於 a=1; 

(5)宣告乙個引用,不是新定義了乙個變數,他只表示該引用名是目標變數名的乙個別名,他本身不是一種資料型別,因此引用本身不佔儲存單元,系統也不給引用分配儲存單元。故:對引用求位址,就是對目標變數求位址。&ra和&a相等。

(6)不能建立陣列的引用。因為陣列是個由若干個元素所組成的集合,所以無法建立乙個陣列的別名。

引用應用

1、引用作為引數 

引用的乙個重要作用就是作為函式的引數。以前的c語言中函式引數傳遞是值傳遞,假如有大塊資料作為引數傳遞的時候,採用的方案往往是指標,因為這樣能夠避免將整塊資料全部壓棧,能夠提高程式的效率。但是現在(c 中)又增加了一種同樣有效率的選擇(在某些特別情況下又是必須的選擇),就是引用。

【例2】:

void swap(int &p1, int &p2) //此處函式的形參p1, p2都是引用 

為在程式中呼叫該函式,則相應的主調函式的呼叫點處,直接以變數作為實參進行呼叫即可,而無需實參變數有任何的特別需要。如:對應上面定義的swap函式,相應的主調函式可寫為:

main( )

{ int a,b;

cin>>a>>b; //輸入a,b兩變數的值

swap(a,b); //直接以變數a和b作為實參呼叫swap函式 

cout<

上述程式執行時,假如輸入資料10 20並回車後,則輸出結果為20 10。

由【例2】可看出:

(1)傳遞引用給函式和傳遞指標的效果是相同的。這時,被調函式的形參就成為原來主調函式中的實參變數或物件的乙個別名來使用,所以在被調函式中對形參變數的操作就是對其相應的目標物件(在主調函式中)的操作。

(2)使用引用傳遞函式的引數,在記憶體中並沒有產生實參的副本,他是直接對實參操作;而使用一般變數傳遞函式的引數,當發生函式呼叫時,需要給形參分配儲存單元,形參變數是實參變數的副本;假如傳遞的是物件,還將呼叫拷貝建構函式。因此,當引數傳遞的資料較大時,用引用比用一般變數傳遞引數的效率和所佔空間都好。

(3)使用指標作為函式的引數雖然也能達到和使用引用的效果,但是,在被調函式中同樣要給形參分配儲存單元,且需要重複使用"*指標變數名"的形式進行運算,這很容易產生錯誤且程式的閱讀性較差;另一方面,在主調函式的呼叫點處,必須用變數的位址作為實參。而引用更容易使用,更清楚。

假如既要利用引用提高程式的效率,又要保護傳遞給函式的資料不在函式中被改變,就應使用常引用。

2、常引用

常引用宣告方式:const 型別識別符號 &引用名=目標變數名;

用這種方式宣告的引用,不能通過引用對目標變數的值進行修改,從而使引用的目標成為const,達到了引用的安全性。

【例3】: 

int a ;

const int &ra=a;

ra=1; //錯誤

a=1; //正確

這不光是讓**更健壯,也有些其他方面的需要。

【例4】:假設有如下函式宣告:

string foo( );

void bar(string & s);

那麼下面的表示式將是非法的:

bar(foo( ));

bar("hello world");

原因在於foo( )和"hello world"串都會產生乙個臨時物件,而在c 中,這些臨時物件都是const型別的。因此上面的表示式就是試圖將乙個const型別的物件轉換為非const型別,這是非法的。

引用型引數應該在能被定義為const的情況下,盡量定義為const 。

深入理解php的引用賦值

關於php引用的一般問題大家看資料就行了,這次我們來聊點有趣的東西。今天乙個朋友在群裡面問起來乙個關於變數引用賦值的問題,問題本身很簡單,我突然想做乙個實驗,來看看array直接賦值和引用賦值效能上的差別,寫完 發現另外乙個問題.請看 a array fill 0,1000000,10 functi...

深入理解Git原理 祖先引用

祖先引用是一種指明乙個提交的方式。如果你在引用的尾部加上乙個 git 會將其解析為該引用的上乙個提交。假設你的提交歷史是 git log pretty format h s graph 734713b fixed refs handling,added gc auto,updated tests d...

深入理解js物件的引用

基本型別 空值 null 未定義 undefined 布林值 boolean 數字 number 字串 string 符號 symbol,es6 中新增 引用型別 物件 object const a 哈哈 const b 哈哈 console.log a b true const c const d...