C++左值引用|随笔

首先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 修饰的 左值引用  左右值皆可引用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值