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、引用不呢改变指向,指针可以改变指向。

          

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

经典文献阅读之--D-Map(无需射线投射的高分辨率激光雷达传感器的占据栅格地图)

0. 简介 占用地图是机器人系统中推理环境未知和已知区域的基本组成部分。《Occupancy Grid Mapping without Ray-Casting for High-resolution LiDAR Sensors》介绍了一种高分辨率LiDAR传感器的高效占用地图框架,称为D-Map。该框架引入了三个主要创新来解决占用地图…

附录2 创建flask镜像

目录 1 python镜像 2 安装flask 3 把项目文件扔进去 3.1 创建git仓库 3.2 上传文件 3.3 获取git链接 3.4 在容器中git clone 4 启动flask服务 5 将容器保存为镜像 6 映射端口运行镜像 7 遇到的问题 8 Dockerfile创建镜像 1 python镜像 首先找一下fla…

Android 老年模式功能 放大字体

1 配置属性 <attr name"text_size_16" format"dimension"/><attr name"text_size_18" format"dimension"/><attr name"text_size_14" format"dimension"/><attr name"text_size_12&quo…

MySQL中的索引失效问题

索引失效的情况 这是正常查询情况&#xff0c;满足最左前缀&#xff0c;先查有先度高的索引。 1. 注意这里最后一种情况&#xff0c;这里和上面只查询 name 小米科技 的命中情况一样。说明索引部分丢失&#xff01; 2. 这里第二条sql中的&#xff0c;status > 1 就是范围查…

咸鱼之王游戏攻略:平民怎么起号?

在《咸鱼之王》这款游戏中&#xff0c;即使是平民玩家&#xff0c;也有着许多可以优化的操作&#xff0c;以最大程度地提高收益。本攻略将针对平民玩家的日常操作进行详细解读&#xff0c;包括黑市购买、资源管理等方面的建议&#xff0c;希望对广大玩家有所帮助。 一、黑市购买…

Vue的学习 —— <vue的开发环境> “6000字超详细”

目录 前言 学习目标 正篇开始 —— 部署vue开发环境 一、Visual Studio Code编辑器 1、简介 2、下载和安装VSCode编辑器 3、安装中文插件 4、安装Volar插件 5、使用VCode编辑器 二、Node.js环境 简介 下载和安装Node.js环境 三、包管理工具 1、简介 2、配置npm …

公司申请增加公众号数量

一般可以申请多少个公众号&#xff1f;众所周知&#xff0c;在2013年前后&#xff0c;公众号申请是不限制数量的&#xff0c;后来企业开始限制申请50个&#xff0c;直到2018年的11月tx又发布&#xff0c;其中个人主体可申请公众号由2个调整为1个&#xff0c;企业主体由50个调整…

信息量、熵、KL散度、交叉熵概念理解

信息量、熵、KL散度、交叉熵概念理解 (1) 信息量 信息量是对事件的不确定性的度量。 假设我们听到了两件事&#xff0c;分别如下&#xff1a;事件A&#xff1a;巴西队进入了世界杯决赛圈。 事件B&#xff1a;中国队进入了世界杯决赛圈。仅凭直觉来说&#xff0c;显而易见事件…

2024年蓝桥杯——复盘

1、握手问题 知识点&#xff1a;模拟 这道题很简单。但是不知道考试的时候有没有写错。一开始的43个人握手&#xff0c;仅需要两两握手&#xff0c;也就是从42个握手开始&#xff0c;而非43.很可惜。这道题没有拿稳这5分。也很有可能是这5分导致没有进决赛。 总结&#xff1a…

我的 OpenLiteSpeed 从开始到放弃之经历

昨晚下定决心放弃 OpenLiteSpeed 了&#xff0c;从开始到放弃历时七天。总结下来放弃 OpenLiteSpeed 主要是实在不适合明月当前的需要&#xff0c;用起来不是锦上添花而是个累赘了都&#xff0c;今天明月就给大家总结分享一下这次 OpenLiteSpeed 从开始到放弃的经历。 一、Ngin…

为什么大家都说it行业要死了?

年后开始找工作开始还不敢投简历怕准备不充分。怕错过了心仪的公司。 花了2周自己死磕了一下自我介绍&#xff0c;和工作经历。然后信心满满就开始投了&#xff0c;结果发现一堆人打招呼一阵欣喜的。可是一查全是外包公司。于是开始了自我怀疑。难道是我能力不行&#xff1f;难…

反转链表(C语言)———链表经典算法题

题目描述​​​​​​206. 反转链表 - 力扣&#xff08;LeetCode&#xff09;&#xff1a; 答案展示: 迭代&#xff1a; 递归&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* rev…

等保测评技术方案(五)

&#xff08;八&#xff09;漏洞扫描方案 1.参与人员 乙方工程师&#xff1a;谭 然、张 剑等。 范围经过双方确认&#xff0c;此次评估的对象包括&#xff1a; 2.网络设备 IP 地址 设备型号 备注 / / / / / / 以现场测评实际数据为准 3.应用系统 地址 …

Python从0到POC编写-魔法方法

name __name__ 是系统定义的内部函数&#xff0c; 它的作用是识别模块。 通常我们看到这样一句话&#xff1a; if __name__ __main____name__ 的值有两种情况&#xff0c;那么挨个来说下。 如果模块是被直接执行的 &#xff0c;那么 __name__ 的值 为 __main__ 例如&…

GBPC2510-ASEMI工业电源专用GBPC2510

编辑&#xff1a;ll GBPC2510-ASEMI工业电源专用GBPC2510 型号&#xff1a;GBPC2510 品牌&#xff1a;ASEMI 封装&#xff1a;GBPC-4 最大重复峰值反向电压&#xff1a;1000V 最大正向平均整流电流(Vdss)&#xff1a;25A 功率(Pd)&#xff1a;中小功率 芯片个数&#x…

汇聚荣科技:拼多多开店时后期押金可以退吗?

在电商领域&#xff0c;拼多多以其独特的团购模式迅速崛起&#xff0c;吸引了众多商家入驻。对于这些商家而言&#xff0c;了解平台的各项费用政策尤为重要&#xff0c;其中押金的退还问题是大家关注的焦点之一。那么&#xff0c;拼多多开店时后期押金可以退吗?答案是肯定的。…

要不还是别搞Google Play了

​好消息&#xff1a;误导性条款合规了 坏消息: 应用被暂停了&#xff0c;太难玩了 5.13日收到邮件&#xff0c;被告知应用因为应用内体验问题被暂停上架了 邮件大意是由于违反执行流程政策(Violation of Enforcement Process policy)。 这个政策主要是讲Google Play会对账户/…

简述RocketMQ系统架构及其相关概念

一、概述 RocketMQ是一款高性能、高吞吐量的分布式消息队列系统&#xff0c;它采用了分布式架构&#xff0c;支持多生产者和消费者并发读写&#xff0c;具有高可用性、高吞吐量、低延迟等特点。本文将对RocketMQ的系统架构进行详细解析。 二、架构设计 RocketMQ采用了分布式架…

深度学习知识点全面总结

ChatGPT 深度学习是一种使用神经网络来模拟人脑处理数据和创建模式的机器学习方法。下面是深度学习的一些主要知识点的总结&#xff1a; 1. 神经网络基础&#xff1a; - 神经元&#xff1a;基本的计算单元&#xff0c;模拟人脑神经元。 - 激活函数&#xff1a;用于增加神…

通过任意文件读取获取weblogic账号密码

对于weblogic获取到账号密码的前提是有任意文件读取存在&#xff0c;当任意文件读取存在时是可以读取配置文件来对账号密码进行解密。weblogic密码使用AES&#xff08;老版本3DES&#xff09;加密&#xff0c;对称加密可解密&#xff0c;只需要找到用户的密文与加密时的密钥即可…