C++干货--引用
前言:
C++的引用,是学习C++的重点之一,它与指针的作用有重叠的部分,但是它绝不是完全取代指针(后面我们也会简单的分析)。
引用的概念:
引用的表示方法:
类型& 引用变量名(对象名) = 引用实体;
举个例子:
这里的b就是a的别名。
通过对二者地址的观察,我们也印证了上面的结论,即引用不是新定义一个变量,而是给已存在变量取了一个别名,它和它引用的变量共用同一块内存空间
ps:C++中,&既有引用又有取地址的意义。
这里学过C语言的都可能有些困惑,&的作用不是取地址吗?其实这就是C++的运算符重重载的一个特殊例子:
注意:引用类型必须和引用实体是同种类型的 。
引用的特性:
1、引用必须初始化。
2、一个变量可以有多个引用:
就像一个人可以有多个外号,理论上别名可以无限取(应该没有这需求)。
3、引用定义后不能改变指向(这个特性极其重要)
![]()
在C++中,引用(reference)是一个已存在变量的别名,它必须在定义时立即初始化,并且一旦初始化后就不能再引用另一个对象。这是C++中引用的一个基本规则。这里的c就不是引用而是对引用的赋值,根据结果来看也确实是改变了变量a和a的引用b的值。
ps:这就像一提诗仙就是李白,诗圣就是杜甫一样,杜甫可以有别的外号,但是诗圣这个外号就是与杜甫绑定的。
常引用:
在C++中,常引用(const reference
)是一个特殊的引用类型,它用于指向一个不可被修改的对象。常引用允许我们传递对象给函数,而无需担心函数会修改传递的对象。
1、定义:
常引用通过在引用类型前添加const
关键字来定义。例如,const int& ref
是一个指向整数的常引用,它不能用于修改所引用的整数。
2、初始化:
常引用必须在定义时立即初始化,并且一旦初始化后就不能再引用另一个对象。
3、使用场景:
函数参数:当我们想要避免传递大型对象的拷贝,并且确保函数不会修改传递的对象时,可以使用常引用作为函数参数。
返回常量对象的引用:当我们想要返回一个常量对象的引用而不是拷贝时,可以使用常引用。这通常用于类的getter函数。
引用的作用:
1、做参数:
1、输出型参数,我们通过改变这个形参,影响外面的实参
上图是C语言交换函数的写法,下图是C++的交换函数的写法,引用可以作函数的形参,x是a的别名,y是b的别名。这里使用引用更加方便,也更好理解。(如果是C语言的话,因为形参是实参的临时拷贝,形参的改变,无法影响实参,所以我们需要传递地址)
2、对象比较大,为了减少消耗,提高效率。
既然指针也能解决的问题,为啥一定要用引用呢?实际上:
以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。
可以看到,引用的效率明显是比指针高的。
2、做返回值
在C++中,函数可以返回引用。这通常用于返回对象的一部分,如数组元素、类的成员等,以便可以修改返回的值。但是,必须小心使用返回引用,因为不正确的使用可能导致悬空引用(dangling references)或未定义的行为。
我们都知道,程序的运行有赖于内存空间中一个个栈的创建与销毁,当指针指向一块已被释放的空间时,这个指针就是野指针,那么引用是否也会有这方面的问题呢?
这段代码是什么意思呢?我们定义了一个函数func,它的作用是什么?是返回变量a吗?还是返回变量a的值呢?
我们在学习C语言时,知道局部变量出了作用域即被销毁,实际上这是因为我们写的函数,实际上是在栈上,计算机为我们开辟了一块空间,函数调用结束栈区为函数开辟的空间就被释放,这时计算机就不知道局部变量a的值是什么了,a的值可能被暂时寄存在寄存器中。
铺垫完毕,下面我们开始讲讲错误例子:
这里我们返回的返回值是什么?是返回的引用值!这就好玩了。就好比说你去酒店开了个房间,你拿了房卡,用完退掉了房间,但是你配了房间的钥匙,没事还想进去住一住........
func()
函数试图返回一个对局部变量a
的引用,但这是错误的,因为局部变量a
在函数返回后会被销毁,其占用的内存空间可能会被其他部分的程序覆盖。因此,返回的这个引用将是一个悬空引用(dangling reference),它不再指向有效的内存地址。更好玩的
这钥匙配了你还真开的了门......
也就是说,这样使用引用是不正确的,纯粹是因为返回值还未被覆盖,走运了而已。
总结一下,引用做返回值,不能使用局部变量,最好是全局变量或静态变量。也就是说如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。
引用与指针的区别:
前面我们提到,指针与引用的功能是有所重叠的,但是,在C++中,引用是对指针的使用在某些复杂场景进行的某些替换,让代码更易懂,但是绝不是用来替代指针的。
在前面我们提到引用的一个重要特性就是引用是不能改变指向的,这可要了老命了。想想我们学习的数据结构,二叉树、双向链表.......但凡增删查改就需要改变指向。
总结一下,引用与指针的区别:
语法上:1、 引用不是对象,没有自己的内存地址,它只是某个对象的别名。而指针是地址,需要开内存空间。
2、引用必须初始化,指针可以初始化也可以不初始化
3、引用不呢改变指向,指针可以改变指向。
相关文章:

C++干货--引用
前言: C的引用,是学习C的重点之一,它与指针的作用有重叠的部分,但是它绝不是完全取代指针(后面我们也会简单的分析)。 引用的概念: 引用 不是新定义一个变量 ,而 是给已存在变量取了一个别名 …...

部署 Sentinel 控制台:实现流量管理和监控
序言 Sentinel 是阿里巴巴开源的一款流量防护与监控平台,它可以帮助开发者有效地管理微服务的流量,实现流量控制、熔断降级、系统负载保护等功能。本文将介绍如何在项目中部署和配置 Sentinel 控制台,实现微服务的流量防护和监控。 一、Sen…...
10、Go Gin 连接Redis以及CookieSession
一、Redis 在Go语言中,使用Gin框架结合Redis数据库可以构建高性能的Web应用程序。Gin是一个轻量级的HTTP框架,提供了快速构建RESTful API的能力;而Redis则是一个高性能的键值存储系统,常用于缓存、消息队列、计数器等多种场景 1、…...

Electron-Vue 脚手架避坑实录,兼容Win11,升级electron22,清理控制台错误
去年的还是有用的,大家继续看,今年再补充一些Electron-Vue 异常处理方案 M1 和 Window10_electron异常处理-CSDN博客 代码gitee.com地址 electron-demo: electron 22 初始代码开发和讲解 升级electron为22版本(这个版本承上启下,…...

国外新闻媒体推广:多元化媒体分发投放-大舍传媒
前言 :随着全球化的进程,国外新闻市场呈现出快速发展的趋势。在这个趋势下,国外新闻媒体推广成为了各行业企业宣传业务的重要一环。本文将重点介绍大舍传媒的多元化媒体分发投放服务,以及对国外新闻媒体推广的意义。 1. 多元化媒…...

【Windows】回忆Win98
回忆Win98,又看到了这个Excel界面,上次还是十多年前的计算机课上 1、安装环境 Win11家庭版,23H2,VMware Workstation Pro 16 , 2、安装步骤及参考 虚拟机里的硬盘设置成SATA(否则各种错误),安装MSDOS7.1ÿ…...
探索QChart:Qt中的数据可视化艺术
目录标题 1. QChart概述2. 创建QChart对象3. 添加数据系列(Series)4. 定制图表外观5. 交互与动画6. 图表布局与管理7. 实例代码与解析8. 总结 在数字化的世界里,数据是新的石油。然而,原始数据本身往往难以理解,数据可…...

【Linux】线程机制解析:理解、优势与Linux系统应用
文章目录 前言:1. 线程概念1.1. 什么是线程1.2. 线程得优点:1.3. 线程的缺点线程异常线程的用途 2. 线程的理解(Linux 系统为例)2.1. 为什么要设计Linux“线程"?2.2. 什么是进程?2.3. 关于调度的问题2…...
java中简单工厂模式,工厂方法模式和抽象工厂模式的区别和联系?
在Java中,简单工厂模式、工厂方法模式和抽象工厂模式都是创建型设计模式,用于解耦对象的创建过程,提高系统的灵活性和可扩展性。它们之间既有相似之处也有明显的区别: 简单工厂模式(Simple Factory Pattern࿰…...
SERVER_DOWN 表示该服务器已经宕机或无法访问
[{"type":"MASTER","host":"/nodes/master/ds-master-0.ds-master-headless:5678","event":"SERVER_DOWN","warningLevel":"SERIOUS"}] 该JSON数据描述了一个事件通知,具体地&am…...

深度论证-高速走线控制100欧姆阻抗一定是最好的选择吗?
高速先生成员--黄刚 对于高速差分信号到底需要控制多少欧姆的阻抗,高速先生相信大部分工程师首先都会看下例如信号的协议文档或者芯片的文档,看看里面有没有推荐的控制阻抗值。例如像PCIE信号,在4.0之后的阻抗会明确要求按照85欧姆来控制&…...

【文末福利送资料】深度探索GPT模型,竟然10个字都不会说?
目录 导读 自回归模型 那么什么时候停下呢? 该停下来,但是概率不让啊 GPT欠缺的两种能力 目录 导读 自回归模型 那么什么时候停下呢? 该停下来,但是概率不让啊 GPT欠缺的两种能力 缺少规划 反省和修订 所有的人工智能…...

一些近来对内网攻防的思考
我知道我最近托更托了很久了,其实也不是小编懒啊 这小编也是一直在写,但是遇到的问题比较多(我太菜了),所以一直拖着。 但是总不能不更吧 那就讲一下进来的一些内网攻防的思考吧 1.CrossC2上线Linux到CS(成功) …...

数据结构--顺序表和链表的区别
顺序表和链表之间各有优劣,我们不能以偏概全,所以我们在使用时要关注任务的注重点,以此来确定我们要使用两者中的哪一个。 不同点: 存储空间上: 顺序表在物理结构上是一定连续的,而链表(这里以带头双向循环…...

【技术分享】 OPC UA安全策略证书简述
那什么是OPC UA证书?用途是什么? 简单来说它是身份验证和权限识别。 OPC UA使用X.509证书标准,该标准定义了标准的公钥格式。建立UA会话的时候,客户端和服务器应用程序会协商一个安全通信通道。数字证书(X.509&#x…...

【Neo4jJDK开箱即用的安装全流程】
neo4j:命令行本地访问loclhost neo4j:命令行本地访问loclhost2 neo4j操作 Neo4j桌面版数据库导出导入 Neo4j安装与配置以及JDK安装与配置教程(超详细) Neo4j 安装、使用教程 Neo4j安装教程 Neo4J桌面版的配置和连接Pycharm jdk-neo对应版本 JDK ORACLE中…...

Linux 操作系统多路IO复用
1.多路IO复用 多路I/O复用是通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。 这个机制能够通过select/poll/eroll等来使用。这些函数都可以同时监视多…...
读取shape文件中数据
读取shape文件中数据 pom文件中引入依赖 <dependency><groupId>org.geotools</groupId><artifactId>gt-shapefile</artifactId><version>26.4</version></dependency>如果jar包下载不下来,在pom中添加下geotools的仓库 <…...

基于STM32F401RET6智能锁项目(使用库函数点灯、按键)
点灯硬件原理图 1、首先,我们查看一下原理图,找到相对应的GPIO口 LED_R低电平导通,LED4亮,所以LED_R的GPIO口需要配置一个低电平才能亮; LED_G低电平导通,LED3亮,所以LED_R的GPIO口需要配置一…...

网络层协议之 IP 协议
IP 协议格式 4 位版本:此处的取值只有两个,4(IPv4)和 6(IPv6),即指定 IP 协议的版本。 4 位首部长度:描述了 IP 报头多长,IP 报头是变长的,因为报头中的选项部…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...

向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...
从实验室到产业:IndexTTS 在六大核心场景的落地实践
一、内容创作:重构数字内容生产范式 在短视频创作领域,IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色,生成的 “各位吴彦祖们大家好” 语音相似度达 97%,单条视频播放量突破百万…...