- 引用可以看做是数据的一个别名,通过这个别名和原来的名字都能够找到这份数据
- 引用必须在定义的同时初始化,并且以后也要从一而终,不能再引用其它数据,这有点类似于常量(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的地址。