C++中探索引用的本质
引用是C++中常用的一个概念,引用简单来说就是一个变量的别名,而变量的本质其实就是一块内存空间的标识,变脸的引用就是变脸的别名,对引用的操作就是对所引用的变量进行操作,但这只是“引用”的文字解释,下面就来剖析一下“引用”的本质
引用的使用
#include<iostream>
using namespace std;
int main()
{
int a = 3, b = 4, * p = &a;
int& r = a;
int*& rp = p;
cout << "a=" << a << "," << "r=" << r << endl;
cout << "p=" << p << "," << "rp=" << rp << endl;
}
上面程序的输出结果是:
可以看出,引用必须依附于某个确定的变量,因为引用就是这片内存空间的另一名字
引用的实现
通过一个例子来看引用在编译器中到底是如何实现的
#include<iostream>
using namespace std;
struct A
{
char name[60];
int size;
int& a;
int& b;
};
int main()
{
cout << sizeof(A) << endl;
}
我们定义了一个结构体,其中有char类型的数组,大小为60,有一个整型的变量和两个整型的引用
在主函数中,我们通过sizeof()输出了结构体的大小
下面是运行结果:
我们会发现,结构体的大小为72字节,拆开来看,应该是60+4+4+4=72字节,也就是说明,引用所占的大小为4个字节,而在C++中,指针的大小也为四个字节,所以在这里,我们可以发现,
引用,其实本质上是一种指针。
对于一个确定的引用来说,它可能在不同的时候表示不同变量的别名,因此一定要在内存中为引用本身分配空间,来标识它所引用的变量。在程序运行时,变量只能依靠地址来区别,因此,只有通过存储被引用变脸的地址,在运行时才能准确定位被引用的变量。
**摘自《清华大学C++程序语言设计第4版》**
准确的说,引用是一种指针常量,也就是在我们定义引用的时候,编译器为我们执行了这样的一种操作:
Type& A<–>Type * const A
所以说,引用在表层上,是变量的别名,但是在编译器中,引用的实现也是靠指针实现的,