C++中的引用

news2024/11/6 9:30:00

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

首先,我们回顾一下什么是引用,引用就是取别名,所以此时我们修改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循环,然后计算里面数个数,来控制打印比较麻烦

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

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

下面我们来看一下效果

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

这就是今天要讲的内容 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428828.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MapReduce原理

MapReduce 编程规范 MapReduce 的开发一共有八个步骤, 其中 Map 阶段分为 2 个步骤,Shuffle 阶段 4 个步骤,Reduce 阶段分为 2 个步骤Map 阶段 2 个步骤 设置 InputFormat 类, 将数据切分为 Key-Value(K1和V1) 对, 输入到第二步自定义 Map 逻辑, 将第一…

十五周算法训练营——链表专题

今天是十五周算法训练营的第三周,主要讲链表专题,包含:反转链表、移除链表、交换链表、链表相交、删除链表中的倒数第N个节点、环形链表II。(欢迎加入十五周算法训练营,与小伙伴一起卷算法——文章末尾进群&#xff09…

【我的创作纪念日】恒川的创作一周年

机缘 大家好,我是热爱跑步的恒川,今天是个特殊的日子(我的创作纪念日),在去年的今天,我发了第一篇博文。去年的时候,刚接触到CSDN,只想把他当作一个学习的工具,后来&…

Node.js -- Express路由

1.路由的概念 在Express中,路由指的是客户端的请求与服务器处理函数之间的关系。 Express中的路由分为三部分,分别是请求的类型,请求的URL地址和处理函数。格式如下: app.METHOD(PATH,HANDLER)例子如下: // 匹配 GE…

【计算几何3】博物馆问题和相关证明

( gallery problem or museum problem ) Art gallery problem - Wikipedia 一、说明 画廊问题是一个基本的计算几何问题,最现实的反映是,到底对一个场景监视会用到几个摄像头。更深刻的层次是,如何对场景生成地图&am…

C生万物 | 十分钟带你学会位段相关知识

结构体相关知识可以先看看这篇文章 —— 链接 一、什么是位段 位段的声明和结构是类似的,有两个不同: 位段的成员必须是 int、unsigned int 或signed int位段的成员名后边有一个冒号和一个数字 在下面,我分别写了一个结构体和一个位段&…

嵌入式51单片机01-开发版介绍与LED流水灯系列

文章目录1. STC89C52单片机介绍2. 单片机预备知识3. LED灯操作系列1. 点亮LED(1)LED原理图连接方式(2) proteus接线图(3)keil代码2. LED灯闪烁(1)实验电路图(2&#xff0…

每日一题104——转置矩阵

给你一个二维整数数组 matrix, 返回 matrix 的 转置矩阵 。 矩阵的 转置 是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[[1,4,7],[2,5,8],[3,6,9]] 示…

大佬们隔空互怼

阅读本文大概需要 1.14 分钟。1、最近国内各大互联网公司都在掀起一股大模型热潮,要想让这股热潮变得更持久更精彩,离不开互联网大佬们的添砖加瓦。比如上周搜狗的王小川跟百度的肖阳,两位互联网大佬隔空互怼的场景,一度让大家觉得…

时序分析 49 -- 贝叶斯时序预测(一)

贝叶斯时序预测(一) 时序预测在统计分析和机器学习领域一直都是一个比较重要的话题。在本系列前面的文章中我们介绍了诸如ARIMA系列方法,Holt-Winter指数平滑模型等多种常用方法,实际上这些看似不同的模型和方法之间都具有千丝万缕…

SpringBoot中处理日期的两种方式(消息转换器)

在Spring Boot中,我们通常会使用Jackson来序列化和反序列化Java对象到JSON。在进行日期序列化时,我们需要指定日期格式,否则Jackson会使用默认格式,这可能不是我们想要的。要指定日期格式,有两种方式: 如果没有处理按照默认的结果如下图: 所以我们需要通过一些手段来对日期进行…

总结一下Redis的缓存雪崩、缓存击穿、缓存穿透

缓存是提高系统性能的一种常见手段,其中Redis是一种常用的高性能缓存数据库。但是在使用缓存时,可能会遇到一些问题,比如缓存击穿、缓存穿透、缓存雪崩等问题,本文将介绍这些问题的概念、原因以及解决方案。 缓存击穿 缓存击穿指…

Jenkins——用户管理、授权策略配置以及Jenkins安全配置管理

这里写目录标题一、Jenkins用户管理1、进入系统管理界面2、创建用户3、编辑用户信息4、编辑用户信息5、删除用户信息二、Jenkins授权策略配置1、授权策略插件2、安装插件:Role-based Authorization Strategy3、管理角色a、全局角色 Global rolesb、项目角色 Item rolesc、节点角…

CVPR | 达摩院开源自监督学习框架CoKe, 单机8卡可训练

团队模型、论文、博文、直播合集,点击此处浏览 一、论文 论文链接: Unsupervised Visual Representation Learning by Online Constrained K-Means 代码链接:https://github.com/idstcv/CoKe 二、背景 虽然基于instance的自监督学习方法在ImageNet上…

注册claude AI账号 slack工作区账号

Claude 是建立在 slack工作区的一个AI人工助手,更像是将chatgpt集成到了会议模式,一个账号实际上拥有了你的会议室和你的AI助手,你可以让你的朋友和同事进入你的房间体验。 Claude是不是openai的产物?目前还不知道,不…

RS232/RS485/RS422 接线说明

RS232/RS485/RS422 接线 文章目录RS232/RS485/RS422 接线RS232RS485422RS232 设备A 和 设备B 没有硬件流控 设备A设备BTXDRXDRXDTXDGNDGND 设备A 和 设备B 使用RTS/CTS 做硬件流控 一般使用RTS/CTS都会由232芯片自动控制, 比如XR21V1414, 需要设备gpio mode 为00…

Docker安装+利用docker安装MySQL(保姆级教程)

前言:本文基于docker安装MySQL,如果还没安装docker的童鞋,点击这里(超大声)安装卸载老版本docker(超详细) 一、在docker仓库搜你想要的镜像版本 docker镜像仓库 打开官网,在搜索框…

Docker 镜像制作 服务编排 私有仓库

DockerNginx部署Redis部署Dockerfile镜像制作容器转为镜像dockerfileDocker服务编排Docker ComposeDocker Compose安装使用docker compose编排nginxspringboot项目Docker私有仓库私有仓库搭建将镜像上传至私有仓库Nginx部署 案例:需求 在Docker容器中部署Nginx&…

【ARMv8 异常模型入门及渐进2 - 系统寄存器访问方法:op1,CRn,CRm,op2】

文章目录1.1 ARMv8 系统寄存器访问概要1.1.1 系统寄存器访问级别1.1.2 ARMv8 系统寄存器编码1.1 ARMv8 系统寄存器访问概要 ARMv8中,取消了协处理器,之前协处理器实现的功能,全部由系统寄存器来是实现。对于系统寄存器的访问,使用…

javaweb在校大学生贷款管理系统ns08a9

1系统主要实现:学生注册、填写详细资料、申请贷款、学校审核、银行审核、贷后管理等功能, (1) 学生注册:学生通过注册用户,提交自己的详细个人资料,考虑现实应用中的安全性,资料提交后不可修改;…