學習C++ -> 引用( References )
一、引用的介紹
引用就是某一變量(目標)的一個別名, 相當於同一個人有了兩個名字, 無論喊哪一個名字實際上都是指的同一個人。 同樣, 在引用上, 對引用的操作與對變量直接操作的效果完全一樣, 因此, 修改引用的值就是在修改變量的值。
從內存角度來說, 引用與變量名指向的都是同一處內存, 對引用地址的操作與對變量名地址的操作都是對同一處內存進行操作。 引用本身占用存儲單元, 但是你沒有辦法從C++層面去訪問到引用所占用的空間。
二、引用的聲明
引用的聲明方式與指針類似, 其形式如下:
類型標識符 &引用名 = 初始值 ;
& 為引用說明符, 表示該數據類型為引用類型。例如:
int n = 10 ; int &rn = n ; //建立變量int型變量n的引用rn
float f ; //建立float型變量f的引用rf
float &rf = f ;
在聲明一個引用時必須對引用進行初始化, 因為引用一經聲明便無法修改, 不能聲明一個未初始化的引用。例如:
int &rn ; //錯, 未初始化
其次, 聲明語句中的類型必須與初始值的變量類型一致, 像下面這樣使用就是錯誤的:
int n = 10 ; double &rn = n ; //錯, 聲明的引用類型為double, 而初始值的類型為int
三、引用使用初步
1>. 例: 使用引用進行值的輸入與輸出:
1 #include<iostream> 2 3 using namespace std; 4 5 int main() 6 { 7 int n ; 8 int &rn = n ; //建立n的引用rn 9 10 cin>>rn ; //通過引用rn對變量進行賦值 11 cout<<"n="<<n<<", rn="<<rn<<endl ; //輸出n與rn的值 12 13 return 0 ; 14 }
輸出:
100 ↙鍵盤輸入 n=100, rn=100 Process returned 0 (0x0) execution time : 2.094 s Press any key to continue.
在該程序中, 首先建立n的引用rn, 再通過引用rn對n的值進行賦值, 准確來說是通過rn對他們所指向的內存單元進行數據的寫入。從輸入以及輸出結果來看, n與rn的值都是100, 也就再一次證明了對引用的任何操作都等價於對目標變量的操作。
2>. 建立指針的引用
對指針建立引用是合法的, 如:
int n = 10 ; int *pn = &n ; //指向變量n的指針
int * &rpn = pn; //建立指針的引用
在建立指針的引用時需要注意 * 號與 & 符號的位置問題, int * &rpn = pn; *號在前, 這樣是正確的; 如果把 * 號放在 & 符號后( int & *rpn = pn; ) 這樣就是錯誤的, 編譯器會報錯。
3>. 對無名實體建立引用
C++允許對用new開辟的無名內存建立引用, 如:
int &r = *new int ;
在銷毀所開辟的內存時, 可以使用 delete &r; 進行實現。
四、引用使用的一些限制
1>. 不能建立數組的引用
數組是由若干個元素組成的集合, 所以無法建立一個數組的別名。 從內存角度來說, 數組名只是代表一個內存單元的地址, 而引用需要的是一個內存單元的實體, 也就是說一次最多只能對該數組中的一個元素建立引用, 如:
int a[5] = {0} ; //對數組名建立引用
int &r = a ; //錯誤, a不是實體 //對數組元素建立引用
int &r = a[2] ; //正確
2>. 不能建立引用的引用
一個變量可以有多個引用, 但C++規定不能對引用再建立引用:
int & &rr = r ; //錯誤, 不能建立引用的引用
五、指針與引用的比較
不同點:
1>. 指針可以被重新賦值, 而引用一經聲明初始化便無法修改 ;
2>. 指針可以為空(NULL), 而引用不能 ;
3>. 指針在聲明時可以不進行初始化, 而引用不能 ;
相同點:
都能直接對實體進行操作。
一般來說, 引用能做到的事指針都能做到, 但指針威力較大, 在使用不當的情況下指針錯誤通過會造成十分嚴重的后果, 風險較高。而引用則相對安全, 並且引用不會使用額外的存儲單元。因此正確的使用引用可以提高代碼變的健壯性, 使程序更高效的運行。
--------------------
wid, 2013.01.22