【C++】引用(取别名)

news2024/11/20 14:33:44

📙 作者简介 :RO-BERRY
📗 学习方向:致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识
📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持


请添加图片描述


引用

  • 1. 引用概念
  • 2. 引用特性
  • 3.常引用
  • 4 使用场景
    • 1. 做参数
    • 2. 做返回值
  • 5.指针和引用的区别


1. 引用概念

🎄引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空
间,它和它引用的变量共用同一块内存空间。
比如:李逵,在家称为"铁牛",江湖上人称"黑旋风"。

引用就是取别名
一个变量可以取多个别名
多个对象不能有一个别名
也可以给别名取别名

引用格式:类型& 引用变量名(对象名) = 引用实体;
比如:

int a;
int& b = a;

这个时候b就是a的别名,我们取b的地址和a的地址是一模一样的,b的值的改变a也会相应改变

:取别名不是一个类型我们必须引用要初始化,不能只int& b;且引用类型必须和引用实体是同种类型的


2. 引用特性

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

void TestRef()
{
   int a = 10;
   // int& ra;   // 该条语句编译时会出错
   int& ra = a;
   int& rra = a;
   printf("%p %p %p\n", &a, &ra, &rra);  
}

3.常引用

void TestConstRef()
{
    const int a = 10;
    //int& ra = a;   // 该语句编译时会出错,a为常量
    const int& ra = a;      
    // int& b = 10; // 该语句编译时会出错,b为常量
    const int& b = 10;
    double d = 12.34;
    //int& rd = d; // 该语句编译时会出错,类型不同
    const int& rd = d;
}

其实在这里我们要注意权限扩大缩小的概念:
请添加图片描述
这样给静态变量取别名,可以取吗?
会发现,在这里报错了,是不可以这样给静态变量取别名的,这等于是放大了权限,int类型的b给const int类型的a取别名
我们改一下
请添加图片描述
这样程序就可以运行了
权限不可以放大,那么缩小可以吗?
请添加图片描述
缩小是可以的


我们来看下面的例子:
请添加图片描述
我们可以看到这儿rj报错了,有人会说这不就是类型不一样报错的吗?
我们再看:
请添加图片描述
诶?我们发现在rj前加一个const就不报错了,这又是为什么?
为了方便以下的解说
我们再来看一个例子

int i=1000;
char c=i;

我们将一个char类型的f赋值为一个int类型的i的值,这样会发生强转,那么i会被强转成char类型吗?
答案是不会,i的值是不会变的,那么什么值在中间变化了呢?
答案是这里临时拷贝了一个临时变量,改变的是那个临时变量,将这个临时变量的值赋值给f
那么回到正题
在这里,rj引用的是i所拷贝的临时变量,这个临时变量具有常性,具有不可修改的性质,所以需要在前面加const

🎄综上:

  • 引用的时候权限不可以放大,可以进行缩小,或者同权限,且类型需要相同
  • 发生强转引用的时候,可以在前面加上一个const解除报错

4 使用场景

🐥引用就取个别名是没有很大的价值的,重头戏还是在于引用做参数
如果参数是一个很大的对象,使用引用是可以提高效率的

1. 做参数

C语言中的交换函数应该是这样写:

void Swap(int* left, int* right)
{
   int temp = *left;
   *left = *right;
   *right = temp;
}

我们需要注意指针的用法,具体含义可参考以前的C语言指针内容😶
但是在我们学了引用之后我们可以写成这样

void Swap(int& left, int& right)
{
   int temp = left;
   left = right;
   right = temp;
}

在这里我们的left和right就是一个别名,访问他俩就相当于访问我们的实参,就不需要进行指针的一系列操作了

2. 做返回值

引用做参数就是形参是实参的别名,就可以直接进行使用
我们先来看这个例子:请添加图片描述请添加图片描述ount结束了n就销毁了,因为它是存在在count栈帧里面的局部变量
我们将返回值类型改为引用会发生什么呢?
所以我们的ret接收的有不是n
我们将返回类型改为引用试试
请添加图片描述
在这个程序里ret接收的就是n的别名,那到底结果ret是1还是别的数呢?
答案其实是不确定的,
如果函数栈帧结束了这个值会被清洗,那么ret会是一个随机值,
但是如果没有清理,那么ret就会是1。


请添加图片描述


很明显,我们运行了发现我们的vs就没有清理,输出结果为1,并不是随机值

再修改一下


请添加图片描述
输出结果:
请添加图片描述
运行一下发现值不是我们计算的那样,变成了随机值
归根结底我们的程序还是一个错误的程序,这里使用引用还是一很大的坑

我们再来看这个程序

请添加图片描述
很明显,这就是随机值
结论是出了函数作用域,返回对象就销毁了,不能引用返回,结果是不确定的
那么如何使用引用返回呢?


请添加图片描述
我们将C变成静态变量,C不再是Add函数栈帧里的数,再也不同考虑栈帧结束销毁了,那这个时候ret结果是多少?
请添加图片描述😮我们会发现输出两次,ret的值都是3,这是为啥?
我们改变一下写法
请添加图片描述
😮为什么在这里变成了3和7?
我们要注意一下,静态成员变量只会被初始化一次,第一种写法是给C初始化的写法,第二个写法则不是,而对于静态成员变量只会被初始化一次,也就是说,第一种写法C的语句只会运行第一次也就是c=1+2=3

5.指针和引用的区别

那么有人就会问了,那么有了这个引用取别名的方法,那指针还有什么用,可以舍去指针吗?
我们来看下面这个程序:请添加图片描述
我们查看a,c,d以及a,c,d的地址会发现,引用是不能改变引用的指向的,所以c永远是a的别名
在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。
请添加图片描述
在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。
引用和指针的不同点:

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

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

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

相关文章

要是能重来,你还会选择程序员吗?

昨天面试了2个应届毕业生,一男一女,男的我觉得技术还可以,就录了,女的没有通过,完事后我去厕所边上的楼道抽烟,却发现女孩子蹲在地上哭的一塌糊涂。 我听得很清楚她跟那个男同学说的话,她已经忘…

双亲委派模式

双亲委派模型 双亲委派的工作过程 一个类加载器收到类加载的请求时,它不会马上加载该类,而是把这个请求委托给父加载器去完成,每一个层次的类加载器都是如此,因此所有的类加载请求都必须先通过启动类加载器尝试加载,只…

【mysql】单表数据量过大解决方案

文章目录 背景问题方案数据库冷热数据分离方案 背景 包装码表单表数据量很大,造成查询瓶颈;目前单表数据量达到3000w,单表字段数16 问题 索引膨胀,查询耗时长,影响正常CRUD … 方案 ● 分区 按日期…范围&#x…

python manage.py createsuperuser运行错误

我做思念作笺,随风而去,落在你常路过的那个街角… 错误复现 PS D:\教学文件\Django\djangoProject\webDemo02> python manage.py createsuperuser System check identified some issues:WARNINGS: ?: (urls.W005) URL namespace admin isnt unique…

如何选择最适合的技术栈来进行外卖App系统开发?

选择合适的技术栈对于外卖App系统的开发至关重要。以下是针对不同方面的考量: 1. 后端开发 对于后端开发,选择一个稳定、高效的框架是关键。Node.js、Python(Django或Flask)、Ruby on Rails等都是流行的选择。举例,…

【unity/vufornia】Duplicate virtual buttons with name.../同一个ImageTarget上多个按钮失灵

问题:在同一个ImageTarget上添加多个按钮时无法触发对应按钮的事件。 解决过程: 1.查看报错:“Duplicate virtual buttons with name...”这一行,顾名思义,命名重复。 2.英文搜索到以下文章,应该在inspe…

思维训练第一课 倒装句

系列文章目录 文章目录 系列文章目录前言一、什么是倒装二、倒装的几种情况1、在以here,there或out,in,up,down,away等小品副词开头的句子里表示强调或修辞需要。但主语是人称代词的时候,主语和谓语的语序不变,当然副词依然放开头…

阿里云CTO周靖人:打造一朵AI时代最开放的云

10月31日,在2023云栖大会上,阿里云CTO周靖人表示,面向智能时代,阿里云将通过从底层算力到AI平台再到模型服务的全栈技术创新,升级云计算体系,打造一朵AI时代最开放的云。在现场,周靖人公布了云计…

SMTP邮件发送图片-如何在github中存储图片并访问

之前写了一篇文章 Go:实现SMTP邮件发送订阅功能(包含163邮箱、163企业邮箱、谷歌gmail邮箱),实现了通过邮箱服务来发送邮件,但都是文字内容,要是想实现邮件发送图片,就需要将图片放到公网可访问…

全链路压力测试的目的在于哪儿?

全链路压力测试(End-to-End Load Testing)是一种关键的性能测试方法,旨在评估一个应用程序或系统在真实使用情况下的性能表现。这种类型的测试模拟了用户在应用程序的各个组成部分之间执行各种操作的情景,以便了解系统在高负载下的表现如何。本文将介绍全…

同步异步 阻塞非阻塞

同步/异步 阻塞/非阻塞 IO一般有两个阶段:数据就绪和数据读写。 数据就绪:根据系统IO操作的就绪状态。 阻塞非阻塞 数据读写:根据应用程序和内核的交互方式。 同步异步 陈硕:在处理IO的时,阻塞和非阻塞都是同步IO…

光伏储能充电桩一体化能量管理系统-安科瑞黄安南

一.背景与需求 随着全球能源危机、用能增加以及新能源技术的增加,新能源发电越来越广,并逐步形成新型能源与电力市场,但新能源的能量密度普遍偏低,进行大功率发电还需要挑选适合的位置场地,因此属于间歇式电源。而微电…

Python与Pycharm的安装与使用

1. Python下载与安装 python官网:链接 Python下载:各版本下载链接 1.1 Python下载 1、首先进入下载页面,选择一个版本下载,这里以Python3.7为例 2、点击下载,随后得到对应安装包 1.2 Python安装 1、双击进行软件…

【漏洞复现】锐捷RG-EW1200G登录绕过

漏洞描述 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作…

Android开发知识学习——Kotlin进阶

文章目录 次级构造主构造器init 代码块构造属性data class相等性解构Elvis 操作符when 操作符operatorLambdainfix 函数嵌套函数注解使用处目标函数简化函数参数默认值扩展函数类型内联函数部分禁用用内联具体化的类型参数抽象属性委托属性委托类委托 Kotlin 标准函数课后题 次…

Linux进程程序替换

一、单进程下的程序替换 使用execl进行程序替换,先执行execl前面的代码,在execl处替换成其它进程的代码和数据继续执行,后面的内容就不执行了,因此只打印before 二、程序替换原理 前面我们fork创建子进程,子进程会继承…

每日一题(LeetCode)----二分查找(三)

每日一题(LeetCode)----二分查找(三) 1.题目(69. x 的平方根 ) 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 **注意…

安防视频汇聚平台EasyCVR调用播放接口的详细流程

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。流媒体视频平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、云存储…

如何优雅的开发?低代码搭建应用如此轻松

目录 一、前言 二、低代码平台体验简述 三、关于平台 四、场景及用户分析 五、产品分析 1、着重讲一下JNPF的编辑器 2、业务流程 六、最后,说些心里话 一、前言 低代码平台改变了应用交付和管理的模式,大幅缩减交付周期,最终帮助业务…

悠络客荣膺CPSE安博会最高荣誉——金鼎奖

10月24日,第十九届CPSE安博会金鼎奖、百强工程商颁奖典礼暨欢迎晚宴在深圳隆重举行。经过专业评审团队对产品的品质、性能、市场表现、应用价值等多方面因素的权威评估,第十九届CPSE安博会最高荣誉奖“金鼎奖”获奖名单正式揭晓。 悠络客UMind-智慧零售/…