C++中的引用

上一次,我们只是浅浅的提了一下引用‘&’,那么今天,我们就正式减少一下引用,以及引用是什么,还有就是引用和指针的区别,引用的特点

首先,我们回顾一下什么是引用,引用就是取别名,所以此时我们修改b的话,同时也会习修改a,而这里的b和a的地址也是相同的

我们来看一下

这里我们在看一下他们的地址是否相同

这里我们看到a和b的地址也是相同的

那么引用还有什么作用呢?

首先引用时可以做参数的,这样会更简单一点

我们来看一下

如果我们要想写一个交换函数怎么写呢??

这是我们平时写的交换函数,首先这个肯定时可以实现两个数字交换的,但是这里还需要解引用等,而且传参的时候也需要先取地址,那么我们就看一下如何用引用来实现交换函数

下面我们来看一下它是否可以实现两个数字交换

我们看到确实实现了两个数字的交换

那么它作为参数会有什么好处呢?

如果是输出型参数这一类那么可容纳顶操作起来是要比引用简单的,而且在传一个大对象的时候,用引用传参肯定是要比传值传参是要好的,这样效率也比较高

引用不仅可以用来传参,还可以用来做返回值,下面我们来看一下

我们来看一下这两组函数,都是返回a,但是一个是用引用返回,另一个是用 传值返回,那么他们由有什么区别呢?

我们来看一下

我们暂时还是没有看出来区别,但是传引用返回时有问题的,我们可以想一下,两个fun函数里面的a变量是临时变量,那么如果出了作用域是要被销毁的,但是我们的引用又是取别名,所以此时我们访问fun2里面的a变量时,我们其实是非法访问,因为出了作用域a这块空间就归还给操作系统了,所以a是非法访问

那么我们要怎么解决呢?

我们想一下,如果我们的a不是局部变量呢?

那么当然是可以的,因为就算出了作用域a变量还是没有被销毁

那么下面我们在看一下const 引用

首先我们对a变量这样引用当然是没有任何问题的,那么我们的c呢?

首先这样是有问题的,因为我们的10是右值,而引用又是取别名,所以这样是不可以的,那么如果我们想引用10,我们应该怎么做?

此时我们只需要加一个const就可以了

我们在来看一下

我们看一下,如果我们想对d进行int类型的引用可以吗?

我们看到这样是不可以的,因为我们的d变量是double类型的,如果我们想要对d变量进行int类型的引用,此时d要是想转化为int此时就会发送隐式类型转换,所以此时i引用的就是中间产生的临时变量,而临时变量又是右值,所以不可以直接进行引用,所以我们的解决方法还是加const

我们来看一下

OK 我们看到这样就没有问题了

下面我们在看一个

我们在看一下,我们这样子可以吗?

还是不可以,但是为什么呢?

我们看到,我们现在是想对一个a和i的运算进行引用,那么这里a和i的运算下来的值进行引用,但是a+i的返回值也是一个临时变量,所以这样直接引用也是不可以的,也是需要加const 

我们在来看一下关于const引用的权限问题

我们看到,我们这里的a变量是一个const值,我们想要引用a变量,此时这样子可以直接引用吗?

首先这样是不可以的,为什么呢?

我们可以想一下,由于我们的a是const的,那么如果我们的b直接引用的话,我们的b不是const的没所以此时想要修改我们的a就可以修改,但是我们的a是const的,不允许被修改,这样就不合逻辑,所以我们的b是不可以直接引用的,如果直接引用的话就是权限的放大,所以这里只可以进行权限的平移,不能进行权限的放大,所以这里是错误的

我们看到这样就正确了

下面我们在看一下 

刚才我们说了权限的放大时不可以的,那么我们现在看一下,我们对一个变量进行const引用可以吗?

这样是可以的! 因为权限的缩小是可以的但是权限不可以放大

下面我们来看一下auto 和语法糖

首先我们来看一下auto是什么?

auto是自动类型推导,我们下面来看一下

这里我们定义了一个a变量,然后我们右定义了一个b变量,但是我们并没有直接写b变量的类型,我们只是给了auto,所以此时我们的b变量是什么类型呢?

我们C++中有一个函数是可以看类型的 typeid()我们可以直接打印出来看一下

我们看到推导的是正确的,那么我们稍微修改一下b,我们看一下能否正确推导

此时我们把b变量修改为了double类型,我们下面看一下

我们看到还是正确的

这个就是auto的自动推导类型 

下面我们看一下语法糖,还有什么事语法糖

我们先看下一这个

如果我们平时想要打印这个数组,我们 for循环,然后计算里面数个数,来控制打印比较麻烦

那么如果我们用语法糖呢?

我们来看一下如果,我们用语法糖的话只需要这么一点代码就可以了,也不用去计算数组个数

下面我们来看一下效果

我们看到都是成功的打印出了这组数

这就是今天要讲的内容 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Naxx Crazy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值