当前位置: 首页 > news >正文

C++基础知识——引用

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。
P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。

  

请添加图片描述

                                           博主主页:Yan. yan.
                                              C语言专栏
                                            数据结构专栏
                                         力扣牛客经典题目专栏
                                                     C++专栏

文章目录

  • 1、引用的概念
  • 2、引用的特性
  • 3、常引用
  • 4、引用的使用场景
    • 1、做参数
    • 2、做返回值
  • 5、传值与传引用的比较
    • 1、效率比较
    • 2、作为返回值类型的性能比较
  • 6、引用与指针区别
    • 引用和指针的不同点

1、引用的概念

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


  例如:李逵,在家称为"铁牛",江湖上人称"黑旋风"。
在这里插入图片描述
类型& 引用变量名(对象名) = 引用实体;
在这里插入图片描述


  上面图片中的a和b所指的是同一个东西,只是名字不同。
  注意::引用类型必须和引用实体是同种类型的

2、引用的特性

  • 引用在定义时必须初始化
    在这里插入图片描述
  • 一个变量可以有多个引用
    在这里插入图片描述
  • 引用一旦引用一个实体,再不能引用其他实体。
    在这里插入图片描述

3、常引用

  在C++中,常引用时通过在引用声明前加上const关键字来定义的,常引用语法如下所示:

const int& a

  常引用时,其权限可以平移、缩小,但是不能放大。
  • 放大【✘】
    在这里插入图片描述

  • 缩小【✔】
    在这里插入图片描述

  • 平移【✔】
    在这里插入图片描述

4、引用的使用场景

1、做参数

  以交换两个变量的值为例,在C语言中我们常用的是运用指针,通过修改变量的地址来达到交换的目的

在这里插入图片描述

40749e1cea93fad4f2b5.png)
  而现在学习了引用之后,就可以通过将引用作为参数的方法,直接修改变量。

在这里插入图片描述

2、做返回值

在这里插入图片描述


  这里的返回值为什么事5呢?

在这里插入图片描述
注意::如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用
引用返回,如果已经还给系统了,则必须使用传值返回。

5、传值与传引用的比较

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

1、效率比较

在这里插入图片描述
  由上述代码可见,传引用比传值效率要快的多。因为编译器在运行时不会给引用变量开辟额外的空间。

2、作为返回值类型的性能比较

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

6、引用与指针区别

  在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间
在这里插入图片描述
  在底层实现上实际是有空间的,因为引用是按照指针方式来实现的
在这里插入图片描述


引用和指针的不同点

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

相关文章:

  • 机器学习课程复习——逻辑回归
  • 图像编辑技术的新篇章:基于扩散模型的综述
  • ubuntu16.04升级cmake版本至3.21.0
  • vuex的配置主要内容
  • k8s集群master故障恢复笔记
  • 华为数通——OSPF
  • linux 简单使用 sftp 和 lftp命令
  • java算法:插入排序
  • 34、shell数组+正则表达式命令
  • 视频监控平台:支持交通部行业标准JT/T905协议(即:出租汽车服务管理信息系统)的源代码的函数和功能介绍及分享
  • 示例:推荐一个应用Adorner做的表单对话框
  • Linux ComfyUI安装使用;Stable Diffusion 3使用
  • day3-xss漏洞(米斯特web渗透测试)
  • 【已解决】在IDEA中使用Git拉取代码时提示:Can‘t update / master has no tracked branch
  • 昇思25天学习打卡营第1天|快速入门
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • CSS3 变换
  • HashMap剖析之内部结构
  • JavaScript新鲜事·第5期
  • JS 面试题总结
  • k8s如何管理Pod
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • React-Native - 收藏集 - 掘金
  • spring学习第二天
  • Vim Clutch | 面向脚踏板编程……
  • VuePress 静态网站生成
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 官方解决所有 npm 全局安装权限问题
  • 那些被忽略的 JavaScript 数组方法细节
  • 使用SAX解析XML
  • 微信小程序实战练习(仿五洲到家微信版)
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 一份游戏开发学习路线
  • 移动端解决方案学习记录
  • const的用法,特别是用在函数前面与后面的区别
  • raise 与 raise ... from 的区别
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • # 达梦数据库知识点
  • (~_~)
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (转)可以带来幸福的一本书
  • (转载)hibernate缓存
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • .NET C# 操作Neo4j图数据库
  • .net dataexcel winform控件 更新 日志
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • @angular/cli项目构建--Dynamic.Form