C++中的const和引用

首先,我们需要知道什么是引用?
定义:引用就是给对象起别名,引用类型引用另一种类型。将声明符写成&d的形式来定义引用类型,其中d是声明的变量名。

int size = 100;
int &sum = size;

要注意的是:
我们在引用的时候必须要给引用赋值。

例如:
int &size;//这种是错误的。

在一般的初始化变量的时候,初始值会被拷贝到新建的对象上,而定义引用时,程序将引用和它的初始值绑定到了一起,而不是通过拷贝的这种方式,一旦初始化完成,引用和它的初始值是绑定在一起的。

我们需要记住这句话

引用就是对象的一个别名,所以引用并非是对象,而是对象的一个别名。定义了一个引用之后所有的操作都是在引用绑定的对象上进行的。

那么这样会有一个问题:我们可不可以定义引用的引用呢?
答案是不可以,因为我们说了引用只是给对象起别名,引用并不是一个对象,所以不能。

当然,我们可以给对象绑定很多引用。

另外,需要注意的是:
其他所有类型的引用和要绑定的对象都要严格匹配,引用只能绑定到对象上,而不能绑定到字面值或者某个表达式的计算结果上。

下面我们来重点介绍const和引用:
我们可以把引用绑定到const对象上,称为常量引用,与普通的引用不同的是,对常量的引用不能被用于修改它所绑定的对象。

例如:

const int c=100;
const int& r1=c;//正确的,引用及对象都是常量
r1 = 11;//这种是错误的,因为r1是对常量的引用,不能改变它的值
int &r2=c;//错误的,不能让一个非常量引用指向一个常量引用

上面我们说过,引用的类型必须要跟所指向的类型保持一致,但是有两个例外。
1.在初始化常量引用时允许使用任意表达式作为初始值,只要该表达式的结果能转化为引用的类型就行了。
2.允许一个常量引用绑定非常量的对象,字面值甚至是一个一般表达式。

例如:

int i = 42;
const int& r1 = i;
const int& r2= 42;
const int &r3 = r1 * 2;

这些都是合法的。

那么有出现了一个问题:如果引用时类型不一致会怎么样呢?
例如:

double val = 3.14;
const int& r1 = val;

此处r1是int型引用,但是val是double类型,那么为了确保r1绑定一个对象,编译器会把上述的代码变为:

const int temp = val;
const int& r1 = temp;

也就是产生了一个临时量。

那么如果r1 不是一个常量,会发生什么呢?
如果r1 不是一个常量,就允许对 r1 赋值,这样改变r1 所引用对象的值,但是此时绑定的是一个临时量,而非val,既然我们将r1 引用val,那么久肯定相同过r1 改变val 的值,否则为什么要给r1 赋值呢?

所以C++规定这行为是非法的。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值