前言
在学习拷贝构造函数的时候又遇到了常引用 就来仔细地学习一下
引入
我们知道引用相当于对象的别名 修改引用就是修改对象本身 它们是同一个地址
常引用
但引用本身也有一些小问题:
- 当我在修改引用的时候 却不希望修改对象本身 我们就可以用常引用
- 当我将引用等价于另一个引用的时候 也是有隐患的 可能在不知道的情况下就出现了错误
下面给出一个例子
void func(const int& x)
{
//想只修改x 但不影响a
}
int main()
{
int a = 0;
int& b = a;
b++;
//想只修改b 但不影响a
func(a);
//其实可以理解为
//const b = a;
// 权限的缩小 --可以的
const int& c = a;
const int x = 10;
//这里的x只有可读权限 r
// 权限的放大 --不可以的
//int& y = x;
//但y却有可读和可写权限 rw
const int& y = x;
//int& z = y;
const int& z = 10;
return 0;
}
由此引出了一个概念 权限可以缩小 但不能放大
本来可以通过修改引用来修改对象本身的 但我加了const 使得只能修改引用本身 这就是权限的缩小
还有一道思考题
//这么写可以吗
const int& m = a + x;
是可以的 因为a+x表达式的返回值是临时对象。临时对象具有常性
还有另一个原因建议用常引用
func(10);
func(a + x);
当func函数的参数传入的常量或具有常属性的临时变量的时候 如果形参不是常引用 那就是权限的放大
常引用和隐式类型转换
先给出一段代码 他可以正常运行吗?
int main()
{
double d = 1.1;
const int& ri = d;
return 0;
}
隐式类型转换的时候 先将对象拷贝给一个int类型的临时变量 这样就可以进行赋值
结语
关于常引用的学习到这里就结束了 希望你有所收获!~~