C++入门篇(3)---引用

news2024/11/23 13:24:30

1.引用

        你有没有被人起过外号?比如身边的朋友,喊他的时候不会叫他的全名,像我很好的朋友,我一般都喜欢叫他"阿威",而不会去称呼全名.我叫他"阿威",他还是他没有什么问题.

        这里新登场的引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间.

下面我们来细说:

        1.1引用的概念

用法:

        类型& 引用变量名(对象名) = 引用实体;

从图中我们可以看出b不仅和a的值相同,地址也是一模一样!这是为什么?

这里要注意的一点是:引用类型必须和引用实体是同种类型的!

这里编译器直接就报错了,这样是不被允许的!

        1.2引用的特性

1. 引用在定义时必须初始化

        这里的引用a没有初始化,编译器直接报错了!

2. 一个变量可以有多个引用

        此时这些引用都是n的别名,指向的就是n,和n共用一块空间!

3. 引用一旦引用一个实体,再不能引用其他实体

        这里的n最开始是a别名,是指向a的引用,引用只能引用一个实体,一旦有了就不能再换了!所以这里的n拿到的是b的值,并不是引用了b,由于n是a的别名,二者共用一块空间,所以改了n改成了20,因此a也会是20!

        1.3常引用

        在C++中,常引用是指在函数参数列表或变量声明中使用const关键字来修饰的引用。常引用的作用是限制对被引用对象的修改。

常引用的语法格式如下:

const 数据类型 &引用名 = 被引用对象;

常引用的特点如下:

  1. 常引用只能引用常量或临时对象,不能引用非常量对象。
  2. 常引用不允许对被引用对象进行修改,即不能通过常引用修改被引用对象的值。
  3. 常引用可以接受非常量对象、常量对象和临时对象作为参数。
  4. 常引用可以提高程序的效率,因为常引用不需要创建临时变量。

 

        需要注意的是,常引用只能引用常量或临时对象,不能引用非常量对象。如果需要引用非常量对象并且不允许修改该对象的值,可以使用const修饰符来声明常量对象。

        1.4使用场景

1.做参数

        在没有引用前,我们交换两个变量的值需要使用指针来完成.

        现在可以使用引用来完成了

2.做返回值

        下面来看一段有问题的代码:

你看出问题所在了吗?程序运行的结果是什么呢?

        这里的结果是不确定的,因为Add函数返回是c的别名,也就是引用,ret接受到的就是c,此时ret就是c,第一次调用,如果函数栈帧结束后,这块空间没有被销毁,那么ret就是3,如果空间被销毁了,那么ret就是不确定的值.

        第二次函数调用Add,虽然ret没有接受,但是因为在第一次函数调用后,ret就已经是c的别名了,是指向c的引用,由于函数栈帧空间的复用性,第二次Add的调用还是在上一次的空间,此时c更改了值,那么ret也就会修改!

        但是这是不确定的,因为在不同的编译器下,函数栈帧调用后,会不会立即清空空间,所以值是不确定的,如果销毁了,那么ret引用的值就是个随机值,如果没销毁,那就是函数正常的返回值.(vs2022下不会立即空间清除)

        但是如果加上了static修饰就会不一样,因为被static修饰的变量是静态变量,是放在静态区上的,而不是栈上,并且由于static修饰的静态的变量只能被初始化一次,所以可以在一定程度上保证安全.

        1.5传值、传引用效率比较

        以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效
率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。

如图所示,你可以看出传引用的效率还是很高的!

        传值的优点是简单、直观,不会对原始数据产生任何影响。但是,传值会导致参数的副本被创建,如果参数较大,传值的效率可能会比较低。

        传引用的优点是效率高,因为不需要创建参数的副本。同时,传引用可以直接修改原始数据,对原始数据产生影响。但是,需要注意的是,如果函数内部不需要修改参数的值,传引用可能会导致意外的修改,因此需要谨慎使用。

        1.6值和引用的作为返回值类型的性能比较

        函数可以返回值或引用作为返回类型。返回值是将函数的结果复制一份返回,而返回引用是返回原始数据的引用。

通过上述代码的比较,发现传值和指针在作为传参以及返回值类型上效率相差很大。        

        返回值的优点是简单、直观,不会对原始数据产生任何影响。但是,返回值会导致结果的副本被创建,如果结果较大,返回值的效率可能会比较低。

        返回引用的优点是效率高,因为不需要创建结果的副本。同时,返回引用可以直接修改原始数据,对原始数据产生影响。但是,需要注意的是,返回引用时需要确保原始数据的生命周期足够长,否则返回的引用可能会指向无效的数据。

        1.7引用和指针的区别

        你会发现引用在很多地方好像与指针类似,这里来区分他们二者的不同.

在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间

在底层实现上实际是有空间的,因为引用是按照指针方式来实现的

通过观察汇编我们可以看出,引用的实现是与指针相同的.

        那既然如此,引用是不是就是指针呢?我们来验证一下,指针根据平台的不同,分为4~8字节,我们来看看引用的大小.

64位平台下,指针大小8字节,而引用ccc还是1个字节的大小,因为在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间,编译器是跟语法走的.

引用和指针的不同点:

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
  2. 引用在定义时必须初始化,指针没有要求
  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
  4. 没有NULL引用,但有NULL指针
  5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
  6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  7. 有多级指针,但是没有多级引用
  8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  9. 引用比指针使用起来相对更安全

本章内容已完:
        如果您喜欢这篇文章,可以点赞、评论和分享给您的同学,这将对我提供巨大的鼓励和支持。另外,我会在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于C++的编程技术问题的深入解析、应用案例和趣味玩法等。感兴趣的话给博主点个关注,获取最新的内容消息!

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

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

相关文章

学会这招,轻松掌握学校教学质量!

在教育领域,教育管理者和学校管理员需要确保教学过程的质量和效率。在线巡课系统是一种强大的工具,可以帮助他们实时监测教学过程、教师绩效和学生学习情况。 在线巡课系统结合了技术和教育的最佳实践,为学校提供了数据驱动的决策支持和资源管…

SGPT: GPT Sentence Embeddings for Semantic Search

简介 语义搜索分为两个部分: 1.搜索和query 相关的topk文档。 2.理解文档和query后面隐藏的语义信息,而不是字面含义。 这篇论文提出了SGPT模型,只用decoder-only的transformer来进行语义搜索和sentence向量的提取。 1.SGPT-BE:来…

有什么手机软件能分离人声和音乐?

很多人在制作混剪视频,需要二次创作的时候,就经常会把人声分离、背景音乐伴奏提取出来,然后重新加入自己的创意跟想法。下面就一起来看看如何用手机软件分离人声和音乐的吧! 音分轨 一款可以分离人声和背景音乐的手机软件&#x…

我才35岁就要面临“人到中年不服老不行”?大龄测试的救赎之路就在其中!

人说“三十而立”,可对于测试来说是“三十而秃”,除了日常秃头,而立之年的测试们的开始焦虑自己的职业未来。 自2017年华为传出“清理35岁以上员工”以来,各企业关于“劝退 35 岁以上员工”、“招聘限 35 岁以下”的传闻此起彼伏…

前端数据可视化之【Echarts介绍】

目录 🌟前言🌟丰富的可视化类型🌟多种数据格式无需转换直接使用🌟移动端优化🌟多渲染方案,跨平台使用!🌟写在最后 🌟前言 ECharts开源来自百度商业前端数据可视化团队&a…

数据类型转换

一.应用函数或者方法 1.cast 函数 cast(变量 as 数据类型) 语义:将变量转为这个类型 2. 变量 ::数据类型 将变量转化为xx类型 3.to_date函数 to_date(字符串,format) 语义:转换成日期类…

运用精益管理思想提升MES管理系统建设水平

随着制造业的不断发展,MES生产管理系统已经成为了企业生产过程中不可或缺的一部分。而在MES管理系统建设过程中,精益管理的思想也越来越受到重视。本文将探讨如何运用精益管理的思想,提高MES系统的建设水平,以更好地服务于企业的生…

故障诊断实验台 | PT600电机电气故障实验台

很多同学因为实验数据而被困扰,目前数据来源有3方面,公开实验数据集、校企合作项目实际数据、自制实验台数据。 公开实验数据集被用烂了,容易被审稿人质疑; 校企合作项目实际数据缺少故障数据,数据需保密,…

SDK和API区别

B站视频:https://www.bilibili.com/video/BV1dA411K7Ps/?spm_id_from333.337.search-card.all.click&vd_source85701dd8aeeae2aaac0299ea796f19bb 假设你在开发一款移动端兽医诊所应用 Lets say youre developing a mobile app for a veterinarian clinic 想法…

vue3怎么创建项目

1、先安装node.js 自行去node.js官网下载 2、创建一个文件夹 终端打开命令 3、执行命令 vue create 项目名称(必须是英文开头,可以英文数字) 4、选择Manually select features(自定义配置) 5、选择Router(后面要使用,也可以先不安装&am…

Sanic​——Python函数变成API的神器

今天给大家介绍一个超好用的框架,迅速将Python函数变成API,它就是最近越来越火的异步Web框架Sanic。 1. Sanic简介 Sanic 是 Python3.7 Web 服务器和 Web 框架,旨在提高性能。它允许使用 Python3.5 中添加的async/await语法,这使…

GPT4应用讲解,如何获取ChatGPT账号

参加每人均可获得1个独立可永久使用的ChatGPT账号,并提供不用fanqiang使用的方法。 前言 GPT对于每个科研人员已经成为不可或缺的辅助工具,不同的研究领域和项目具有不同的需求。例如在科研编程、绘图领域: 1、编程建议和示例代码: 无论你…

GFS分布式文件系统实验

GFS概念 Gluster 是一个开源的分布式文件系统 它是一个C/S架构 由存储服务器、客户端以及NFS/Samba存储网关组成 没有元数据服务器组件,这有助于提升整个系统的性能,可靠性和稳定性 文件系统定义 负责实现数据存储方式,以什么格式保存在…

idea 2022 一个工作空间下导入git项目 后 无法导入第二个git项目

idea 2022 一个工作空间下导入git项目 后 无法导入第二个git项目 如图所示 我导入了一个git项目后,菜单栏出现了一个git按钮 找不到 导入git项目的按钮了 方式1、 通过idea设置 打开全局设置 如下图 把git先改为none,保存 保存后就可以看到 VCS按钮 导入…

程序员架构修炼:架构设计概要,业务、应用、技术、数据架构

作为一个程序员,了解架构设计是非常重要的,它能够帮助你更好地理解如何构建大型软件系统,并能够满足用户的需求。在架构设计中,通常会涉及到四种不同类型的架构:业务架构、应用架构、技术架构和数据架构。 1、业务架构…

鸿蒙初体验

下载与安装DevEco Studio 在HarmonyOS应用开发学习之前,需要进行一些准备工作,首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 进入DevEco Studio下载官网,单击“立即下载”进入下载页面。 DevEco Studio提供了Windows版本和…

迅雷下载宝-openwrt-kodexplorer

下载仓库 雾渺/KODExplorer - Gitee.com 下载后解压上传文件/mnt/mmcblk0/kodexplorer ip:8080访问

NFTScan | 10.09~10.15 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期:2023.10.09~ 2023.10.15 NFT 热点资讯 01/ DeLabs:所有 DeGods 已重置回 Season1,用户可于本周将 y00ts 免费迁移至以太坊 10 月 9 日,DeGods & y…

分布式存储系统在智慧广电8K场景的融合应用

一、前言 广电行业的业务系统主要包含收录、编辑、播出、媒资管理、归档等环节,即通常所说的采、编、播、管、存业务,每个环节几乎都伴随着频繁的数据调取和使用。尤其在8K高清时代,视频码流已经从高清的100Mbps前进到400-2000 Mbps&#xf…

2022最新版-李宏毅机器学习深度学习课程-P14 批次(batch)与动量(momentum)

一、batch 回顾epoch、shuffle batch size大还是小?都有好处 大batchsize的好处 由于GPU有并行计算的能力,左边并不一定用时更长 反而是,batch size小的时候,要跑完一个epoch所用的update时间更长,所以时间方面的比较…