首先c++中有左右值引用的概念
这里就说左值引用
左值 顾名思义是左边的值
是什么的左边?
是等于符号的左边 ( = )
比如
int a = 0; float n = 0.0f; char c ='c';
这些变量都是左值 (a n c)
0 = 7;8 = a;
这两个 0 8 就是右值
因为她们两个是无法出现在左边的 不符合运算啊 我们平时写数学运算
能写 一个数值 被赋值给改变为另一个数值吗?
而正常的左值引用 正是引用 可以放在等号( = ) 左边的变量的
我们来看下代码
上述 我们 只看 281行以下的 这里提一下 decltype 这个个关键字 是静态提取变量类型的 既然提取类型 自然就可以 拿来声明变量 280 和 284 都是这样做的
首先我们的 M& k = pb;
这句话就是 左值引用变量 k 初始化时引用了 pb 这个M类型的对象
也就是 变量 k 是 pb 的别名 用 k 即是用 pb
我们使用 k 改变 k 里面的变量时 pb 里面也会改变 别名而不是新的对象 共享 pb的内存块
M类上图所示 其中 int Val{100}; 是默认初始化的写法 c++11
她们两个值是一样的吧
接下来再看看各自的内存地址
地址是一致的
ok 现在讨论另一个 问题
左值引用 初始化时 引用了一个对象 而后续 是否可以 更改 去引用另一个对象?
代码
可以看到 我们想要将 左值引用 k 修改引用 到 ppb 对象
但是结果是
k 的引用地址始终没变 但是 内部的 Val 值却是改变了 怎么回事呢
我们在此处打上断点 进行单步调试
发现·程序进入了 M 的重载 = 运算符的函数中
在这个我们的确是拿 op 的 Val 值修改了自己的值
我们来看看地址 注意 c变量 我们拿了 op 的地址
结果是一致的 这也说明了
左值引用 是 初始化引用后 无法再次修改引用其它对象的
既然如此 我们 思考 引用另一个 引用变量 会如何?能不能像指针一样 改变为另一个指针值呢?
我们依然单步调试
发现依然是进入了重载等式函数
且地址也是没有修改的
引用必须初始化 在函数参数里的除外
const修饰的左值引用 能干什么?
const修饰的左值引用可以引用 右值 且有地址
总结
左值引用声明时 必须初始化引用 在函数形参中 除外
除了初始化以外 无法修改引用
非const 修饰的 左值引用只能引用左值
const 修饰的 左值引用 左右值皆可引用