C++中引用的本质分析

引用是C++中心增加的内容,在C语言是没有引用这一种用法的。那什么是引用呢?

大家都知道,我们定义变量的时候,其实是将变量名和内存空间关联起来,变量名就是一段内存空间的别名。当我们使用引用的时候,例如int& a = b; 其实就相当于a是b的别名,也就是说a和b都是指向同一段存储空间的。那这么做有什么意义呢?

C语言和C++中用引用实现两个数的交换的差别

我们在C语言的时候,当要交换两个变量的值时,很多都是使用指针来实现的,例如下面的代码:

void swap(int* a,int* b)
{
	int t = *a;
	*a = *b;
	*b = t;
}

当我们要调用该函数的时候,我们向该函数传入的是地址,例如swap( &i , &j );
那如果我们在C++中用引用是怎么实现的呢?其实只是将上面的代码进行简单的修改:

void swap(int& a,int& b)
{
	int t = a;
	a = b;
	b = t;
}

对于这个函数的调用,我们就是之间传入变量名就好了,例如:swap( i , j ); 。这样相比于C语言中的传入地址是不是比较直观明了呢?相比于指针的方式更具有可读性和实用性。

const引用

在C++中可以用const声明引用,例如:const int& b = a; 用这样的引用会使得b在程序的执行过程中 无法对其进行复制运算,可以看下下面的代码:

int a = 5;
const int& b = a;
int* p = (int*)&b;
b = 10;		// 错误,b具有只读属性
*P = 15;    // 正确,此时a = b = *p = 15
a = 20;		// 正确,此时a = b = *p = 20

也就是说上面的例子,我们无法通过b改变值,但是可以通过*p和a来改变。这个时候b具有只读的属性。
当使用常量对const引用进行初始化的的时候,C++会为常量值分配存储空间,并将引用名作为这段存储空间的别名。

const int& b = 1;
int* p = (int*)&b;
b = 10;		// 错误,b具有只读属性
*P = 15;    // 正确,此时b = *p = 15

使用常量对const引用进行初始化将会得到一个只读变量。

引用的本质

引用在C++中的内部实现是一个指针常量。例如:int& a,在内部中相当于int * const a
对于int a = 10;int& b = a;你如果看这两条语句的汇编代码你就会发现,对于int a = 10;C++编译器是将10存进a所代表的存储空间里,对于int& b = a;是将a所代表的内存地址赋给b变量,这是不是跟我们的指针操作一样?其实引用的本质就是指针。
从内部实现上看,C++编译器在编译的时候吧指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。
从使用者的角度看,引用只是一个别名,C++为了实用性而隐藏了引用就是指针这一本质。

总结

引用作为变量别名而存在旨在代替指针,但引用的本质是指针
const引用可以使得变量具有只读属性
引用可以尽可能的避开一些内存错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值