浅析C++引用

浅析C++引用"&"

​ C++中引入了一个新的语言特性——引用(&),它表示某一对象的别名,对象与该对象的引用都是指向统一地址。那么我们就来看看关于引用的一些知识点吧🧐

特性

  1. 引用在定义时必须初始化
  2. 一个变量可以有多个引用
  3. 引用仅能引用一个实体,不能再引用其他实体

用法

​ 可以看出,引用与被引用的对象使用同一块空间

Pasted image 20240702193838

​ 由此我们得出第一种用法,引用传参

​ 在C语言中,交换函数需要使用指针获得地址,通过解引用形参达到修改实参的目的,这无疑是很麻烦的,而在C++中,只需要在接收参数时进行引用,就可以实现数据修改。

​ 并且,由于引用指向的是同一地址,则在接收时不需要开辟栈区,所以当遇到大量数组传递时,引用可以提高运行效率

Pasted image 20240702194438

第二种,传引用返回

​ 在C语言中,我们的传值返回是返回的临时变量,临时变量会存在寄存器中,或者提前开辟一段空间存储返回值,等返回后再销毁。而传引用返回则不会去开辟新的空间,直接将返回值所在的空间传回,这样也能够提高运行效率。

​ 但是传引用返回是一种较为危险的行为,如下图:

​ 当我们使用这种写法时,编译器会警告使用了临时变量的地址,原因是我们将返回值n给引用了,但n是个临时变量,出了作用域会销毁,此时根据编译器的不同,得到的结果也不同(有的编译器会暂时保存临时变量,直到该地址被再次使用,有的编译器会直接销毁,编译结果为随机值)

image-20240707171532563

​ 再来看下面这种写法,函数不变,但是将a给引用了,此时第一次打印没问题,第二次就变成了随机值,原因是第一次打印跟上面情况一样,编译器暂时保存了临时变量,但是第二次调用cout函数时,cout将count函数的空间覆盖了,取不到n的值,则被引用的a也变成了随机值!

image-20240707172002612

​ 由此得出,引用返回确实能提高运行效率,但是不要在返回局部变量时使用!可以在如下情况合理使用:

​ 写一个简易的顺序表,用引用返回和引用传参可以实现读和修改并用的功能

image-20240707174028868

常引用

​ 来看下面的例子

image-20240707183847963

image-20240707184037431

​ 第一个例子出错原因是a被const修饰成为静态常量,而b没有const,此时权限被放大了,正常情况下权限只能平移或者缩小,所以const int& b = a才是正确写法

​ 第二个列子中,类型转换过程中会创建临时变量,临时变量具有常性,也属于权限放大,double前应加const修饰

​ 第三个例子与第二个相同,该返回值是临时变量,具有常性,需要加const修饰

底层

​ 引用的底层与指针一样,但是不能说引用就是指针

image-20240707184858580

引用与指针

  1. 引用概念上是变量的别名,指针是存储一个变量的地址
  2. 引用在定义时必须初始化,指针没有要求
  3. 引用无法改变对象,指针可以改变对象
  4. sizeof中,引用为引用类型大小,而指针始终是地址空间所占字节个数
  5. 引用自加是对象+1,指针则是向后偏移一个类型的大小
  6. 没有多级引用
  7. 指针需要解引用才能取值,引用不需要
  8. 引用相对于指针更安全

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

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

相关文章

zdppy_api+vue3+antd前后端分离开发,使用描述列表组件渲染用户详情信息

后端代码 import api import upload import time import amcomment import env import mcrud import amuserdetailsave_dir "uploads" env.load(".env") db mcrud.new_env()app api.Api(routes[*amcomment.get_routes(db),*amuserdetail.get_routes(db…

记一次微信小程序逆向

扫码领取网安教程 遇到瓶颈了,不知道该干什么,突然想到学校的小程序 闲来无事就看一看 抓包下来的数据是这样的,嗯,下机(hhh 一、反编译程序 加密嘛,之前抓了看到是加密就放弃了,现在重新弄一…

轻松转换!两款AI工具让word秒变ppt!

想把Word文档一键生成PPT,过去有一个很常见的做法:先在Word文档中设置标题样式,通过标题样式来分隔每一部分,之后导出为PPT,就能得到一份PPT的雏形,但这种方法无法对PPT自动进行美化,即得到的只…

js替换对象内部的对象名称或属性名称-(第二篇)递归

1.代码示例: function replaceKey(obj, oldKey, newKey) {// 如果不是对象或者oldKey不存在,直接返回原对象if (typeof obj ! object || !obj || !(oldKey in obj)) return obj;// 如果是数组,遍历数组每个元素if (Array.isArray(obj)) {obj…

【Python】一文向您详细介绍 np.inner()

【Python】一文向您详细介绍 np.inner() 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介:985高校的普通本硕,曾…

君方智能设计平台-对象持久化技术方案

1.背景介绍 1.1序列化功能 序列化是将复杂的图形对象、数据结构或对象转换成一种可被存储、传输或分享的格式的过程。这个格式通常是二进制或文本形式,能够轻松地保存在文件中或通过网络发送到其他应用程序。序列化的目的是将数据持久化,使其在不同时间…

【学术会议征稿】2024年第四届工商管理与数据科学学术会议(BADS 2024)

2024年第四届工商管理与数据科学学术会议(BADS 2024) 2024 4th International Conference on Business Administration and Data Science 2024年第四届工商管理与数据科学学术会议(BADS 2024)将于2024年10月25-27日在新疆喀什召开,由喀什大学支持本次会议。会议旨…

Mapboxgl 根据 AWS 地形的高程值制作等高线

更多精彩内容尽在dt.sim3d.cn&#xff0c;关注公众号【sky的数孪技术】&#xff0c;技术交流、源码下载请添加VX&#xff1a;digital_twin123 使用mapboxgl 3.0版本&#xff0c;根据 AWS 地形图块的高程值制作等高线&#xff0c;源码如下&#xff1a; <!DOCTYPE html> &…

OV证书签发一般要多久?

OV证书&#xff0c;即组织验证型SSL证书&#xff0c;的签发流程涉及多个阶段&#xff0c;其具体时间取决于多种因素。OV证书的签发一般需要1-3个工作日&#xff0c;这个过程可以分为以下几个阶段&#xff1a; 1、选择和购买证书&#xff1a; 用户需要在SSL证书服务商处选择合适…

AnaPico为众多工厂产线老化测试提供高效经济的微波解决方案

在电子设备的生产中&#xff0c;老化测试在整个使用寿命期间的可靠性和对声明参数的保证起着重要作用&#xff0c;尤其是在特殊应用&#xff08;国防和航天工业、电信、医药等&#xff09;方面。即使经过成功的参数和功能测试&#xff0c;在实际操作条件下使用时也有可能出现设…

【JSP+Servlet+Maven】——优质外卖订餐系统之概论部分

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

【Linux】进程的概念 + 查看进程

前言&#xff1a; 在前面我们学习了Liunx的基本指令和权限相关知识&#xff0c;还有基本工具的使用&#xff0c;有了以上的基础知识我们本章将正式接触Linux操作系统。 目录 1.冯诺依曼体系结构1.1 内存存在的意义1.2 程序加载到内存的含义1.3 程序的预加载&#xff1a; 2 .认识…

python读取指定文件夹下的图片(glob获取)

python读取指定文件夹下的图片&#xff08;glob获取&#xff09; 定义traverse_images函数&#xff0c;仅需要改变下根路径即可 glob是python中用来查找符合特定规则的文件路径名的函数 import os from glob import globdef traverse_images (folder_path):image_formats …

Google账号输入用户名和密码后提醒要到手机通知点是,还要点击数字,但是我手机收不到

有一些朋友换了一个新的电脑后手机登录谷歌账号时&#xff0c;用户名和密码都正确输入以后&#xff0c;第三步弹出一个提示&#xff0c;要在手机上的通知栏点击是&#xff0c;并且点击手机上相应的数字才能继续登录。 但是自己的手机上下拉通知栏却没有来自谷歌的通知&#xf…

mkv怎么改成mp4格式?把mkv改成MP4的几种方法介绍

mkv怎么改成mp4格式&#xff1f;将mkv格式的视频文件转换为MP4格式是许多用户常常需要解决的问题&#xff0c;尤其是在不同设备之间传输和播放视频时。mkv是一种灵活且功能强大的多媒体容器格式&#xff0c;能够包含多种视频、音频和字幕轨道。然而&#xff0c;尽管其优势显著&…

前端web在线PPT编辑器-PPTLIST

哈喽&#xff0c;大家好&#xff0c;今天给大家介绍一款的在线的PPT编辑器开源框架-PPTLIST&#xff1b;他是一个基于 Vue3.x TypeScript 的在线演示文稿&#xff08;幻灯片&#xff09;应用&#xff0c;还原了大部分 Office PowerPoint 常用功能&#xff0c;支持 文字、图片、…

MSP学习

一、迁移资源调研 完成导入&#xff0c;类似完成选型分析 离线工具调研 账单 二、迁移计划 1、

【教程】新的Selenium!整合了隐藏浏览器指纹等功能

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 前景提要 driver Driver() 常用driver 接口 最后的话 前景提要 新的selenium&#xff0c;整合了隐藏浏览器指纹&#xff0c;非常好用&#x…

Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇

Nginx七层&#xff08;应用层&#xff09;反向代理 HTTP反向代理proxy_pass篇 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of thi…

极品AI大模型,抓紧收藏!整合包!

近期&#xff0c;科技巨头谷歌终于发布了1个月前在I/O开发者大会上预告过的Gemma 2大模型。据谷歌介绍&#xff0c;与第1代Gemma模型相比&#xff0c;新模型拥有更优的性能&#xff0c;推理效率也更高。我当然是&#xff0c;“无所谓&#xff0c;我会出手.jpg”&#xff0c;给大…