- 引用可以看做是數據的一個別名,通過這個別名和原來的名字都能夠找到這份數據
- 引用必須在定義的同時初始化,并且以后也要從一而終,不能再引用其它數據,這有點類似于常量(const 變量)。
- 引用變量 里面 實際存儲的 內容實際上 是 所引用數據的地址, 但是直接使用的引用變量的話, 卻使用的是所指代的數據.
比如以下代碼:
int a = 10;
int &r = a;
cout << a << endl; // 10
cout << r << endl; // 10
cout << &a << endl;
cout << &r << endl; // 通過打印結果可以看出來,&a與&r是一樣的。
// 實際上內存模型 并不是這樣的。
// 使用&r取地址時,編譯器會對代碼進行隱式的轉換,使得代碼輸出的是 r 的內容(a 的地址),而不是 r 的地址,這就是為什么獲取不到引用變量的地址的原因。也就是說,不是變量 r 不占用內存,而是編譯器不讓獲取它的地址。
引用變量r, 里面存儲的內容時 變量 a的地址。
- 還有一兒例子可以證明:請看如下代碼:
#include <iostream>using namespace std;
int num = 99;
class A {
public:A();
private:int n;int &r;int &rr;int &rrr;
};
A::A() : n(0), r(num) , rr(r), rrr(rr){}
int main() {A *a = new A();cout << sizeof(A) << endl; //輸出A類型的大小cout << hex << *((int*)a + 1) << endl; //輸出r本身的內容cout << hex << &num << endl; //輸出num變量的地址cout << hex << *((int *)a + 2) << endl;cout << hex << *((int *)a + 3) << endl;return 0;
}
輸出結果為:
16
130b000
0130B000
130b000
130b000
簡單來說 再舉個簡單的例子
int a = 3;
int &r = a;
int &rr = r;
int &rrr = rr;
r 與 rr 與 rrr 這三個引用變量里面存儲的值 實際上 都是 a的地址。