当前位置: 首页 > news >正文

【C++】5. 引用

文章目录

  • 前言
  • 一、引用
    • 1.1 理解引用
    • 1.2 引用的特性
    • 1.3 引用的权限
    • 1.4 引用的使用场景
      • 1.4.1 做参数
      • 1.4.2 做返回值
    • 1.5 引用的本质


前言

C语言中什么最难学?那当然就是指针了。不但使用起来麻烦,时不时还会产生一些意料之外的错误。C++提供了一种方式,能做到指针的作用,但比指针用起来更容易。这种方式称为引用


一、引用

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。比如:李逵,在家称为"铁牛",江湖上人称"黑旋风"。我们叫铁牛,黑旋风都是指李逵。

1.1 理解引用

首先我们看看如何使用引用:

类型& 引用变量名(对象名) = 引用实体
在这里插入图片描述

引用不是新定义一个变量,而是给已存在变量取了一个别名看了这个例子,我想你应该能深刻理解这句话了。
在这里插入图片描述
不难看出,引用比指针方便了不少。不用麻烦的去写取地址,解引用。


1.2 引用的特性

虽然引用很好用,但使用方式不对,那也没用。

  1. 引用必须初始化
    在这里插入图片描述

  2. 一个实体可以有多个引用,但一个引用只能指向一个实体,且不能改变。
    在这里插入图片描述
    当然不是,c = b;是将b的值赋给c,而c又是a的引用(别名),即将b的值赋给a

  3. 引用的对象可以是变量、常量……,使用时注意引用类型必须和引用实体是同种类型
    (这里会涉及到引用的权限,后文有讲)
    在这里插入图片描述


1.3 引用的权限

上面提到引用的对象可以是常量,那可以写出这样的代码
int& a = 10;但很遗憾,这样写是错的。const int& a = 10;这样写才对。
要搞明白为什么,需要我们知晓引用的权限。

首先,我们要了解权限是什么?看下面代码
int a = 10;
int& b = a;
b能改变a吗?当然可以,b = 11;a就变为11,此时的b相当于我们使用电脑时,以管理员的方式运行,权限很大。它可以读写a,影响到a。这就是引用b的权限。
回到上面的问题,为什么必须写成const int& a = 10;?因为10是常量,常量不能改变。如果写成int& a = 10,这不就和刚才的b一样吗,表式a有能力改变10,但10是常量,不能改变。因此我们不能给a能够改变10的权限,即a只能读,不能写,所以我们需要加上const

了解权限是什么,下面我们来学习如何正确给与权限。

引用过程,权限不能增大,只能平移或缩小。

在这里插入图片描述

有两种特殊情况,如下

  1. 类型转换时,权限变化
    在这里插入图片描述

在发生类型转换时,会产生临时变量,临时变量具有常性(相当于加了const), 如下

在这里插入图片描述
同理,const int& c = a;c是临时变量的引用,权限为只读。

小知识:c为临时变量的引用,那临时变量用完销毁后,c会这么办?答案是临时变量不会立马销毁,对于类似于int& c = a;这样的引用初始化,编译器会将其实现为一个指针,并在需要时进行隐式解引用。所以,即使原始对象离开了作用域,只要其引用仍然存在,临时变量也会与引用一起存在,直到引用失效。换句话说,临时变量的生命周期是由其所绑定的引用决定的,而不是由其作用域决定的。


函数返回值,放回值会放在临时变量里,临时变量具有常性。

在这里插入图片描述

既然函数返回值也是通过临时变量来传递的,那如果用引用接收该怎么写?
如下:
在这里插入图片描述


1.4 引用的使用场景

1.4.1 做参数

  1. 输出型参数
    我们在力扣上使用c语言刷题时,常常出现这么一个参数int* returnSize,这里的returnSize就是输出型参数。即能够将值带回的参数。
    在这里插入图片描述

  1. 提高效率
    函数传值调用:函数形参是函数实参的临时拷贝,如果函数实参过大,形参也就很大。所以实参过大时,一般都是传址调用。引用相当于传址调用,因此能节省效率。

1.4.2 做返回值

上面提到函数返回值会被放在临时变量里。那如果返回的对象数据量很大呢?那么临时变量就会很大,这就很低效了。那我们怎么做?返回它的引用。
在这里插入图片描述

当函数的返回引用时,不会创建临时变量。

因此返回引用能够提高效率——吗?
之前我们提到,如果临时变量用引用来接收,会延长临时变量的作用域,所以引用能指向正确的空间(临时变量的地址)。但现在函数返回引用是不会创建临时变量,那引用指向哪块空间呢?
在这里插入图片描述
问题来了,如下:
在这里插入图片描述
但为什么打印的结果会是19呢?而且并没有报错。
因此这取决于编译器,我使用的是VS2022。根据结果可以推断,VS2022并没有清理函数栈帧,也没有禁止这种非法访问。
在这里插入图片描述

因此这样使用引用,不但不能提高效率,反倒有很大可能出现bug。
那用引用做返回值岂不是没什么用?

返回全局变量、静态变量、堆区上的空间的引用就可以了。
这些空间不会在函数调用结束后释放。


1.5 引用的本质

在这里插入图片描述

其实引用就是通过指针来实现。我们说引用不开辟空间,是从语法层面来说的,从底层来看,引用就是指针,会开辟空间。
因此,在C++中,我们可以将引用视为一种语法上的简洁方式来处理指针的语义。


相关文章:

【C++】5. 引用

文章目录 前言一、引用1.1 理解引用1.2 引用的特性1.3 引用的权限1.4 引用的使用场景1.4.1 做参数1.4.2 做返回值 1.5 引用的本质 前言 C语言中什么最难学?那当然就是指针了。不但使用起来麻烦,时不时还会产生一些意料之外的错误。C提供了一种方式&…...

初识C++(二)

在初识c(一)当中我们已经向大家介绍了四个c和C语言不同的使用方法。接下来我们再来向大家介绍另外的一些新的c语言的使用方法。 🌵引用 简单一点来说引用就是给已存在的变量起一个别名。这个别名通常的作用和C语言当中的指针类似。我们可以通…...

编译时报Clang SA is not enabled问题解决

报此问题应该是swap不足导致的,原因是用的虚拟机,改为16G内存问题排除 具体解决如下: 1.free -h 查看当前分区大小和使用情况 2.扩展分区大小 2.1首先删除系统默认分区 sudo swapoff /swapfile sudo rm /swapfile 2.2新建swap分区&#xf…...

【论文阅读】You Are What You Do:通过数据来源分析寻找隐蔽的恶意软件

You Are What You Do: Hunting Stealthy Malware via Data Provenance Analysis NDSS-2020 伊利诺伊大学香槟分校、德克萨斯大学达拉斯分校 Wang Q, Hassan W U, Li D, et al. You Are What You Do: Hunting Stealthy Malware via Data Provenance Analysis[C]//NDSS. 2020. 目…...

c#期末复习题重点难点题

2. (单选题, 9分)在.NET中,.NET Framework由( )组成。 A. FCL和CLR -开发库和运行环境B. ADO.NETASP.NET -数据操作和web框架C. CLS和CTS -语法规范和类型规范 即所有语言和语法规范 和 各语言间的类型互操作性规范D. Winform和ASP.NET…...

Sass @mixin 与 @include

Sass mixin 与 include mixin 指令允许我们定义一个可以在整个样式表中重复使用的样式。 include 指令可以将混入(mixin)引入到文档中。 定义一个混入 混入(mixin)通过 mixin 指令来定义。 mixin name { property: value; property: value; ... } 以…...

ROS——Teb算法的优化

一、简介 “TEB”全称Time Elastic Band(时间弹性带)Local Planner,该方法针对全局路径规划器生成的初始轨迹进行后续修正(modification),从而优化机器人的运动轨迹,属于局部路径规划。 关于eletic band(橡…...

java+ssm 社区超市网上商城果蔬(水果蔬菜)管理系统

在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括超市果蔬管理系统的网络应用,在外国超市果蔬管理系统已经是很普遍的方式,不过国内的超市果蔬管理系统可能还处于起步阶段。超市果蔬管理系统具有果蔬管…...

igh主站搭建过程(e1000e 网卡/ generic网卡)

1、下载igh源码 garyjxes:~$ git clone https://gitlab.com/etherlab.org/ethercat.git 2、配置(可参考官方文档) garyjxes:~/Xenomai/xenomai-v3.2.1$ sudo cp …/…/ethercat/ . -r garyjxes:~/Xenomai/xenomai-v3.2.1/ethercat$ sudo ./bootstrap to…...

K8S第一讲 Kubernetes之Secret详解

Secret详解 secret用来保存小片敏感数据的k8s资源,例如密码,token,或者秘钥。这类数据当然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少暴露的风险。 用户可以创建自己的secre…...

每周一算法:高精度减法

高精度减法 高精度减法是采用模拟算法对上百位甚至更多位的整数进行减法运算,其基本思想是模拟竖式计算,一般分为下面几步: 首先,使用数组存储大整数的每一个位然后,判断被减数和减数的大小关系: 如果被减数大于等于减数,结果为非负数,直接计算差否则,结果为负数,先…...

Session使用和原理分析图与实现原理-- 代码演示说明 Session 的生命周期和读取的机制代码分析

目录 Web 开发会话技术 -Session —session 技术 session 基本原理 Session 可以做什么 如何理解 Session Session 的基本使用 session 底层实现机制 原理分析图 代码演示 CreateSession.java 测试 Session 创的机制, 注意抓包分析​编辑 ReadSession.j…...

在win10系统中安装anaconda

1、 Anaconda的下载 你可以根据你的操作系统是32位还是64位选择对应的版本到官网下载,但是官网下载龟速。 建议到清华大学镜像站下载 :Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source MirrorIndex of /anaconda/archiv…...

【菜鸡读论文】Cross-domain Named Entity Recognition via Graph Matching

【菜鸡读论文】Cross-domain Named Entity Recognition via Graph Matching 最近到了研一下学期,很多身边的同学也开始有了成果,但本菜鸡一点成果都没有【大哭】所以也没什么好写的。虽然菜鸡口头上不说,但内心也感受到非常之焦虑。最近读论…...

代码随想录算法训练营第三十五天|860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

文章目录 860.柠檬水找零406.根据身高重建队列452. 用最少数量的箭引爆气球:star: 860.柠檬水找零 链接:代码随想录 5美元相当滴珍贵 解题思路: 情况一:账单是5,直接收下。 情况二:账单是10,消耗一个5,增加…...

爬虫为什么需要多线程

多线程爬虫是一种同时运行多个线程来提高爬取速度的爬虫方式。通过将大量的工作分配给不同的线程,可以减少爬虫的运行时间,提高效率。不过需要注意的是,在爬取过程中需要合理的管理线程数,以避免对被爬取的网站造成过大的负荷。 …...

下一代智能座舱风口下,“超级”Tier 1强势崛起

智能座舱进入全新周期,强者愈强的趋势会快速显现。 可以观察到,智能座舱功能日趋多元化。从多屏互动到舱内全场景多元交互,到更多娱乐平台的上线,智能座舱已经从最初的重多功能转变成重体验。 从架构层面来看,各个功…...

第 三 章 UML 类图

文章目录 前言一、依赖关系(虚线箭头)二、泛化关系:继承(实线空心箭头)三、实现关系(虚线空心箭头)四、关联关系(一对一为实线箭头,一对多为实线)五、聚合关系…...

java版工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显示…...

内网穿透实现在外远程连接RabbitMQ服务

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 转载自远控源码文章:无公网IP&#xff…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

SpringTask-03.入门案例

一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...