引用就是某一變量(目標)的一個別名,對引用的操作與對變量直接操作完全一樣。
引用的聲明方法:類型標識符&引用名=目標變量名;
例如:
int q; int &ra=a;
說明:
- &在此不是求地址運算,而是標識作用。
- 類型表示符是指目標變量的類型。
- 聲明引用時,必須同時對其進行初始化。
- 引用聲明完,相當於目標變量名有兩個別名,即該目標原名稱和應用名,切不能把該引用名作為其他變量名的別名。
-
聲明一個引用,不是新定義了一個變量,它只表示該引用名是目標變量名的一個別名,它本身不是一種數據類型,因此引用本身不占存儲單元,系統也不給引用分配存儲單元。故:對
引用求地址,就是對目標變量求地址。&ra與&a相等。
-
不能建立數組的引用。因為數組是一個由若干個元素所組成的集合,所以無法建立一個數組的別名。
引用應用
- 引用作為參數
引用的一個重要作用就是作為函數的參數。以前的C語言中函數參數傳遞是值傳遞,如果有大塊數據作為參數傳遞的時候,采用的方案往往是指針,因為這樣可以避免將整塊數據全部壓棧,
可以提高程序的效率。但是現在(C++中)又增加了一種同樣有效率的選擇(在某些特殊情況下又是必須的選擇),就是引用。
例
void swap(int &p1,int &p2) //此處函數的形參p1, p2都是引用 { int p; p=p1; p1=p2; p2=p; }
為在程序中調用該函數,則相應的主調函數的調用點處,直接以變量作為實參進行調用即可,而不需要實參變量有任何的特殊要求。
如:對應上面定義的swap函數,相應的主調函數可寫為:
main() { int a,b; cin>>a>>b; swap(a,b); //直接以a,b作為實參調用swap函數 cout<<a<<' '<<b; }
- 傳遞引用給函數和傳遞指針給函數的效果是一樣的。這時,被調函數的形參就成為原來主調函數中的實參變量或對象的一個別名來使用,所以在被調函數中,對形參變量的操作就是對其相應的目標對象的操作。
-
使用引用傳遞函數的參數,在內存中並沒有產生實參的副本,它是直接對實參操作;而使用一般變量傳遞函數的參數,當發生函數調用時,需要給形參分配存儲單元,形參變量是實參
變量的副本;如果傳遞的是對象,還將調用拷貝構造函數。因此,當參數傳遞的數據較大時,用引用比用一般變量傳遞參數的效率和所占空間都好。
-
使用指針作為函數的參數雖然也能達到與使用引用的效果,但是,在被調函數中同樣要給形參分配存儲單元,且需要重復使用"*指針變量名"的形式進行運算,這很容易產生錯誤且程序
的閱讀性較差;另一方面,在主調函數的調用點處,必須用變量的地址作為實參。而引用更容易使用,更清晰。
2、引用作為返回值
要以引用返回函數值,則函數定義時要按以下格式:
類型標識符&函數名(形參列表及類型說明)
{函數體}
說明:
1以引用返回函數值,定義函數時需要在函數名前加&
2用引用返回一個函數值的最大好處是,在內存中不產生被返回值的副本。
例
#include <iostream.h> float temp; float fn1(float r);//聲明函數fn1 float &fn2(float r);聲明函數fn2 float fn1(float r)//定義函數fn1,它以返回值的方式返回函數值 { temp=(float)(r*r*3.14); return temp; } float &fn2(float r)//定義函數fn2,它以引用方式返回函數值 { temp=(float)(r*r*3.14); return temp; } void main ()//主函數 { float a=fn1(10.0)//系統生成要返回值的副本(即臨時變量) float &b=fn1(10.0)//可能會出錯, //不能從被調函數中返回一個臨時變量或局部變量的引用 float c=fn2(10.0); //第3種情況,系統不生成返回值的副本 //可以從被調函數中返回一個全局變量的引用 float &d=fn2(10.0); //第4種情況,系統不生成返回值的副本 //可以從被調函數中返回一個全局變量的引用 cout<<a<<c<<d; }