引用&a在聲明定義時是這樣,使用時就是a,這時的a相當於*a罷了,待續。

引用和指針的其他區別

1) 引用必須在定義時初始化,並且以後也要從一而終,不能再指向其他數據;而指針沒有這個限制,指針在定義時不必賦值,以後也能指向任意數據。

2) 可以有 const 指針,但是沒有 const 引用。也就是說,引用變量不能定義爲下面的形式:

  1. int a = 20;
  2. int & const r = a;

因爲 r 本來就不能改變指向,加上 const 是多此一舉。

其實引用只是對指針進行了簡單的封裝,它的底層依然是通過指針實現的,引用佔用的內存和指針佔用的內存長度一樣,在 32 位環境下是 4 個字節,在 64 位環境下是 8 個字節,之所以不能獲取引用的地址,是因爲編譯器進行了內部轉換。以下面的語句爲例:
int a = 99;
int &r = a;
r = 18;
cout<<&r<<endl;
編譯時會被轉換成如下的形式:
int a = 99;
int *r = &a;
*r = 18;
cout<<r<<endl;
使用&r取地址時,編譯器會對代碼進行隱式的轉換,使得代碼輸出的是 r 的內容(a 的地址),而不是 r 的地址,這就是爲什麼獲取不到引用變量的地址的原因。也就是說,不是變量 r 不佔用內存,而是編譯器不讓獲取它的地址。

當引用作爲函數參數時,也會有類似的轉換。以下面的代碼爲例:
純文本複製
//定義函數
void swap(int &r1, int &r2){
    int temp = r1;
    r1 = r2;
    r2 = temp;
}
/調用函數
int num1 = 10, num2 = 20;
swap(num1, num2);
編譯時會被轉換成如下的形式:
//定義函數
void swap(int *r1, int *r2){
    int temp = *r1;
    *r1 = *r2;
    *r2 = temp;
}
//調用函數
int num1 = 10, num2 = 20;
swap(&num1, &num2);

引用雖然是基於指針實現的,但它比指針更加易用,從上面的兩個例子也可以看出來,通過指針獲取數據時需要加*,書寫麻煩,而引用不需要,它和普通變量的使用方式一樣。
C++ 的發明人 Bjarne Stroustrup 也說過,他在 C++ 中引入引用的直接目的是爲了讓代碼的書寫更加漂亮,尤其是在運算符重載中,不借助引用有時候會使得運算符的使用很麻煩。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章