常量引用
- 1.常量引用错误的案例
- 2.常量引用的前提条件
- 3.分析错误案例
- 4.总结
常量引用
- 1.常量引用错误的案例
- 2.常量引用的前提条件
- 3.分析错误案例
- 4.总结
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++ 中,引用其实就是一个变量的别名,所以如果我们修改了引用,
其实就是间接修改了变量,
如果我们不希望能够对引用做修改,那么我们可以声明为常引用。