【C++】常量引用(常引用)一些经典问题

常量引用在C++中用于防止函数参数或返回值被意外修改。错误案例包括尝试修改常量引用、将非左值赋给引用以及不同类型引用的匹配。常量引用必须初始化,并且一旦绑定到一个对象,就不能修改。在函数返回值为临时对象或不同类型转换时,需使用const引用以避免错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.常量引用错误的案例

1.常量引用的使用的场景一般是用来修饰函数的形参,防止误操作。
比如:

//在下列函数我只想打印a的值,并不想改变我的参数,
//可以在形参前加一个const
void fun(const int& x)//表示x是一个常量,不可修改
{
	x += 10;//不小心修改了我的参数,会报错
	cout << x;
}
int main()
{
	int a = 20;
	fun(a);
}

在这里插入图片描述

2.或者是某一个函数返回一个值,我们用了引用去接收它时,要加上const
比如以下这段错误代码:

int fun()
{
	int n = 10;
	return n;
}
int main()
{
	int& ret = fun();
}

在这里插入图片描述

我们加上const即可

int fun()
{
	int n = 10;
	return n;
}
int main()
{
	const int& ret = fun();
}

3.使用引用时,类型不一样的情况

//错误代码:
int main()
{
	int i = 10;
	double& a = i;
}

在这里插入图片描述

正确修改:

//这里并不是简单的类型不匹配问题,我们下面会分析
int main()
{
	int i = 10;
	const double& a = i;
}

2.常量引用的前提条件

我们先来看看非常量引用
引用本身需要一个合法的内存空间。
比如栈区,堆区的变量。
如下图,就是错误的使用方式,因为10只是一个字面量,并不是左值。
左值是指可被引用的数据对象,例如,变量,数组元素,结构成员,引用和解除引用的指针都是左值。
在这里插入图片描述

我们的目的是使用常量引用,就是要告诉编译器,a是一个常量,即加上const即可。

正确修改方式:

int main()
{
	const int& a = 10;
	//这里实际上是编译器创建了一个临时变量,再将这个临时变量给a
	//int temp =  10;const int& a = temp;
}

3.分析错误案例

上面的错误案例1好解释,就是const修饰的常引用不可修改。

案例2

//错误代码
int fun()
{
	int n = 10;
	return n;
}
int main()
{
	int& ret = fun();
}

这段代码报错的是:非常量引用的初始值必须为左值。
意思就是该函数的返回值并不是一个左值,而是一个常量
既然是常量就要加上const在这里插入图片描述
这是因为我们这个函数在返回时,并不是返回n,而是创建了一个临时变量返回,而且这个临时变量具有常量性,我们要在引用前加上const,告诉编译器,我们使用的时常量引用。

//正确代码
int fun()
{
	int n = 10;
	return n;
}
int main()
{
	const int& ret = fun();
}

案例3

//错误代码:
int main()
{
	int i = 10;
	double& a = i;
}

在这里插入图片描述

这里并不是类型不匹配问题,而是编译器创建了一个临时变量来接收int类型的i转化为double类型的值,而这个临时变量具有常量性,所以要加上const,告诉编译器我们用的是常引用。

int main()
{
	int i = 10;
	const double& a = i;
}

4.总结

在 C++ 中,引用其实就是一个变量的别名,所以如果我们修改了引用,
其实就是间接修改了变量,
如果我们不希望能够对引用做修改,那么我们可以声明为常引用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fun gun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值