上一次,我们只是浅浅的提了一下引用‘&’,那么今天,我们就正式减少一下引用,以及引用是什么,还有就是引用和指针的区别,引用的特点
首先,我们回顾一下什么是引用,引用就是取别名,所以此时我们修改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循环,然后计算里面数个数,来控制打印比较麻烦
那么如果我们用语法糖呢?
我们来看一下如果,我们用语法糖的话只需要这么一点代码就可以了,也不用去计算数组个数
下面我们来看一下效果
我们看到都是成功的打印出了这组数
这就是今天要讲的内容