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

          

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

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

相关文章

【转载】【亲测可用】Ubuntu18.04安装VTK-8.2.0

这篇文章转载大部分都参考自下面的链接,注意cmake的版本,如果版本不对是编译失败的 https://blog.csdn.net/qq_42257666/article/details/124574029?ops_request_misc%257B%2522request%255Fid%2522%253A%2522171566768016800182751339%2522%252C%2522…

Power query与Excel的区别,优势?

Power Query是Microsoft Excel的一个强大数据导入、转换和自动化的插件工具,它在Excel 2010之后的版本中被发布出来,随着时间的发展,功能不断增强。 以下是Power Query的一些优势以及它与Excel传统数据处理方式的区别和一些令人印象深刻的功…

【选型推荐】洁净室( 区) 悬浮粒子的测试方法及仪器选型

环境监测承担着环境污染控制措施有效性的评判者的角色。其本身不是一个控制措施,环境监测本身并不能够改变环境指标,降低污染。一个有效的环境监测体系是能反映洁净区内的粒子和微生物的真实水平。确认环境是否满足法规的要求,同时给予污染控…

【Java 演示灵活导出数据】

演示灵活导出数据 🎉🎉🎉🎉🎉🎉【小吴小吴bug全无开通公众号】关注公众号获取第一时间博客动态 背景今天临时起兴打开稀土掘金导航栏看到页面推广gitee项目恰巧最近也在学习python了解到python爬虫很厉害&…

java基础之特殊类枚举

一、什么是枚举 枚举是JDK5新增特性,用来表示一组常量值,比如一年由四个季节,一年中有12个月份,、订单有未付款​、已付款、已发货、已收货状态等。 二、枚举的好处 ​用枚举来表示组常量值,可以避免非法值。 publ…

# 从浅入深 学习 SpringCloud 微服务架构(十八)

从浅入深 学习 SpringCloud 微服务架构(十八) 一、开源配置中心 Apollo:概述 1、开源配置中心 Apollo Apollo -A reliable configuration management system Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理…

一篇文章告诉你:通信网优比计算机岗位好在哪?

据优橙2023年就业人员专业分布统计,通信专业学员占比32.7%,非通信专业学员占比64.8%,其他占比2.5%。 可见从事网优的学员中大部分为非通信专业。而非通信专业中72%的学生在学习通信网优还是计算机专业中,选择了通信网优。 为什么越…

聚焦光量子应用开发!Quandela 发布新版量子计算云服务

内容来源:量子前哨(ID:Qforepost) 文丨浪味仙 排版丨沛贤 深度好文:1200字丨5分钟阅读 摘要:法国光量子计算公司 Quandela宣布推出新版量子计算云服务 Quandela Cloud 2.0,通过创新技术确保量…

很难找到全的!150个软件测试领域专业术语汇总

1. 单元测试(Unit Testing):对软件中的最小功能单元(通常是函数或方法)进行测试,以验证其是否按预期工作。 2. 集成测试(Integration Testing):测试不同模块之间的交互…

Python 运筹优化13 Thompson Sampling 解读

说明 这部分应该是Multi-Armed Bandit的最后一部分了。 内容 1 On Line Ads 这个实验,最初的目的就是为了选出最佳的广告。首先,通过伯努利分布,模拟了某个广告的有效率。在真实场景里,我们是无法知道那个广告更好的。可能在t…

java springboot连接sqlserver使用

pom.xml增加sqlserver驱动 <dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>mssql-jdbc</artifactId><version>9.4.0.jre8</version></dependency>application.yml配置文件 server:port: 9001 #spring: …

【Vue】vue项目中使用百度地图教程

在Vue项目中显示百度地图&#xff0c;你需要遵循以下步骤&#xff1a; 1. 注册百度开发者账号并获取API密钥2. 在Vue项目中引入百度地图API3.在Vue组件中创建地图容器4. 在Vue组件中初始化地图5. 添加其他地图组件&#xff08;可选&#xff09;6. 处理地图事件&#xff08;可选…

【Power BI】DAX语言 VS Power Query M语言

DAX&#xff08;Data Analysis Expressions&#xff09;和Power Query M语言是Microsoft Power BI和Excel中的两种强大的数据处理和分析工具。尽管它们在许多方面都有重叠之处&#xff0c;特别是用于数据建模和数据转换&#xff0c;但它们在用途、语法和功能上有显著的区别。本…

嵌入式单片机笔试题

DC-DC 和 LDO两者有何区别&#xff1f; DC-DC转换器&#xff08;直流-直流转换器&#xff09;和LDO&#xff08;低压差线性稳压器&#xff09;都是用于电源管理的设备&#xff0c;但它们在原理和特性上有一些显著的区别&#xff1a; 原理&#xff1a; DC-DC转换器通过改变输…

Linux 第二十七章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

下单制造fpc的工艺参数

FPC工艺简介 - 百度文库 (baidu.com) FPC工艺参数 - 豆丁网 (docin.com) FPC柔性线路板的主要参数.ppt (book118.com) 捷多邦&#xff1a; 华秋&#xff1a; 背胶&#xff1a; FPC板背胶是可以粘接在光滑表面的一种薄型胶带&#xff0c;可以在狭小以及光滑的表面上用来提供高…

互联网医院源码|禾高互联网医院系统功能和优势

互联网医院系统是一种建立在互联网基础上的医疗服务平台&#xff0c;其目标是通过数字化手段改善患者和医生之间的医疗互动。这一系统不仅使患者能够更轻松地获取医疗服务&#xff0c;而且也为医生提供了更灵活的工作方式。 1、智能导诊:提供人体模拟图&#xff0c;模拟门诊医生…

【学习笔记】C++每日一记[20240513]

简述静态全局变量的概念 在全局变量前加上static关键字&#xff0c;就定义了一个静态全局变量。通常情况下&#xff0c;静态全局变量的声明和定义放在源文件中&#xff0c;并且不能使用extern关键字将静态全局变量导出&#xff0c;因此静态全局变量的**作用于仅限于定义静态全…

振弦式应变计的与实际测量值不一致怎么办

在进行结构健康监测或其他工程测量时&#xff0c;精确性和可靠性至关重要。振弦式表面应变计是一种广泛使用的测量工具&#xff0c;它通过测量材料表面的应变来评估结构的应力状态。然而&#xff0c;在实际应用中&#xff0c;振弦式应变计的测量值与实际应变值之间的不一致问题…

【JavaScript】---- 使用 Tween 实现转盘抽奖

1. 实现效果 2. 需求分析 它和正常的转盘抽奖不一样&#xff0c;一般实现都是指针形式的&#xff0c;转盘转动&#xff0c;最后指针停留在奖品的随机位置&#xff1b;通过上边图发现奖品必须刚好停留在奖品的位置&#xff0c;因为不是指针&#xff0c;所以不能最后落到随机位置…