C++ 常引用的本质

引用作为形参时以常指针作为实现方式,而引用还有常引用的形式,顾名思义他的实现方式就是指向常量的常指针,即对象地址与值都不可修改,即

#include <iostream>

using namespace std;

void main() {
    int a = 2;
    const int &b= a;
    b = 3;  
}

在这里插入图片描述

不过常引用有一些有意思的特性,被const修饰的对象的引用必须是常引用,一般引用绑定const对象时不合法的。

void main() {
    const int a = 1;
    int &b = a;
}

在这里插入图片描述

根据错误提示可知,由于对象是被const修饰 的,表示不能被修改,引用当然也不能修改,必须使用const引用。

而另一个特性则是const引用可以使用相关类型的对象初始化,

void main() {
    int a = 1;
    const int &b= 1;
}

这是使用了整形常量初始化了常引用,而这是合法的。

void main() {
    float a = 1.23;
    const int &b= a;
}

这是使用了浮点数初始化了常引用,而这是合法的。

void main() {
		float a = 1;
		const int &b = a;
		cout << "b:" << b << endl;
		a = 2;
		cout << "b:" << b << endl;
		cout << "a:" << &a << endl;
		cout << "b:" << &b << endl;
}

在这里插入图片描述
常引用申请了新内存以存放初始化的值,并以const修饰,这样就可以实现对引用对象的类型转换,不过这样也等于引用了新的对象,跟最初的引用对象就没关系了。
那么初始化常量的操作也可以解释地通,常引用先申请一块内存存放常量,再指向内存地址,这样就可以完成一般引用不会申请内存便完不成的操作。
由于会申请内存,常引用还有另一种特性,关联相关类型的对象时会转换类型。

void main() {
        const float &b = 1;   
		cout << "b:" << b << endl;   	
		cout << "b:" << &b << endl;
}

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190508200322791.png

常引用有了自己的内存,那么初始化常量的操作也可以解释地通,常引用先申请一块内存存放常量,再指向内存地址,这样就可以完成一般引用不会申请内存便完不成的操作。

由于会申请内存,常引用还有另一种特性,关联相关类型的对象时会转换类型。

void main() {
        float a = 1.23;
        const int &b = a;
        cout << "b:" << b<< endl;
        a = 2.34;
        cout << "b:" << b<< endl;
        cout << "a:" <<&a << endl;
        cout << "b:" <<&b << endl;
}

在这里插入图片描述

可见第二次的值也没有改变,可这时a对应的地址的值已经改变了,那么常引用指向的地址肯定不同于对象了,不过这样也等于引用了新的对象,跟最初的引用对象就没关系了。
而转换类型可以理解为先申请一段内存用于存放整形,再将对象的值放入内存,最后再将常引用指向内存,这样就会指向与常引用相同类型的对象了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值