C++初识--------带你从不同的角度理解引用的巧妙之处

1.对于展开的理解

我们这里的展开包括命名空间的展开和头文件的展开,两者的含义是不一样的:

头文件的展开就是把头文件拷贝到当前的文件里面;

命名空间的展开不是拷贝,而是因为编译器本身默认是到全局里面去找,当我们的命名空间展开之后,就授权可以到命名空间里面去查找。

我们在一般进行练习的时候,为了简便,我们会使用using namespace std就相当于授权访问库里面的内容,但是在项目里面,我们一般不会这样做。

2.引用在顺序表和链表里面的运用

我们之前在实现链表的时候,我们在之前是使用二级指针在链表的尾部插入数据,如果不是二级指针的话就会使得实参无法同步,但是有了引用之后,我们可以使用引用实现二级指针的功能。

(1)引用在定义的时候必须进行初始化;

(2)一经引用就不能改变指向;

(3)一个变量是可以有多个引用的;

引用作为返回值:

int ret就是把n的别名直接返回给ret所以两次打印的结果都是1;

这个地方是int &ret,相当于ret是n的别名,cout会创建栈帧,这个时候可能还会打印1,第二次进行打印就是第一次覆盖的结果,所以第二次会打印随机值;

调用函数cout创建的栈帧可能会很大,当我们的count函数的前面有比如int a[1000],这个时候即使覆盖可能也只回覆盖掉数组,可能不会影响我们的ret,所以不一定会被覆盖;

出了作用域,没有还给系统,就可以使用引用返回,否则就不能够使用引用返回。

下面的是顺序表里面的引用:

我们在实现顺序表的查找数据和修改数据的时候,是使用了2个函数进行的:seqlistfind和seqlistmodify函数

使用引用的话,只使用一个函数就可以同时实现查找数据和修改数据的功能。这个里面我们使用的是引用,ps相当于就是我们的结构体s1的别名,我们的返回值相当于是ps.a[i]的别名,这个时候我们可以同时实现修改和查找,怎么实现的呢?如果想要查找,我们就可以直接打印对应的下标,修改的话我们就可以直接赋值,根据引用的特性进行修改,打印的结果就是引用修改之后的数值,如果没有赋值,我们就可以找到顺序表里面的值,这样话,我们使用一个函数加上引用就可以实现想要查找就输出里面的值,想要修改就输出修改之后的数值。

不加引用是否可以实现,我们可以实践一下:

显然,我们可以观察到,这个是不可行的,为什么会出现这个报错?因为如果我们不使用引用返回,相当于我们返回的就是一个ps.a[i]的拷贝,这个拷贝具有常属性,我们对他可以惊醒打印输出,但是不可以进行修改;如果我们使用引用,相当于得到的就是别名,我们是可以进行修改的。

3.引用的权限问题

下面的就是引用的3种不同的权限:权限的平移,权限的放大,权限的缩小;

显然权限的缩小以及权限的平移是正确的,权限的放大是不允许的,在下面的例子里面a原来的是const int类型,使用别名b之后就是int类型,显然是放大了权限,因为之前的a带有const修饰,是不可以改变的,但是我们的b就是简单的int类型,是允许修改的。

我们使用相同的const int的类型的c进行接收就是权限的平移,是可以的;

我们之前的d是int类型,但是其别名f是const int 类型,显然是可以的,这个就是权限的缩小。

4.利用引用的权限解释一个现象

上面的就是一个使用引用的权限就可以进行解释的现象:

第一个就是一个简单的函数的调用,使用ret接受函数的返回值;

第二个使用了引用,这里会报错,原因就是我们的函数调用完成之后,会产生临时变量,临时变量的值给了ret,临时变量具有常数性,我们的ret是不具有的,这里就可以简单的理解为把原来的临时变量的常属性权限房放大为ret的可修改的权限,相当于是权限的放大,所以会报错;

第三个我们使用const修饰之后,这个报错就解决了,因为我们的临时变量具有常属性,我们的ret使用const进行修饰了之后,同样也是不可以进行修改的,这个就可以理解为权限的平移,所以是正确的;

实际上我们加上const进行修饰之后,这个临时变量的生命周期就被延长了,只有我们的ret使用完成之后,这个临时变量才会被销毁。

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

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

相关文章

一些常见的Windows命令

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言看版本号查找端口启动程序杀死某个端口查看全部端口看ip进入目录就是总结 前言 提示:这里可以添加本文要记录的大概内容: 例如&#x…

Linux——匿名管道

为什么要有进程间通信? 在操作系统中,进程是独立运行的程序,多个进程之间要想互相协作完成任务,就需要进程间通信。 什么是进程间通信? 数据传输:一个进程需要将它的数据发送给另一个进程资源共享&#…

03-JAVA设计模式-解析器模式

解释器模式 什么是解析器模式 在Java中,解释器模式(Interpreter Pattern)是一种行为设计模式,它给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子…

六、e2studio VS STM32CubeIDE之代码自动补全

目录 一、概述/目的 二、eclipse c/c自动补全 2.1 修改实现原理 2.2 修改插件cdt.ui的方法 2.2.1 资料来源 2.2.2 修改的主要流程或逻辑 2.2.3 失败的原因 三、呼吁st和Renesas厂家支持自动补全代码 六、e2studio VS STM32CubeIDE之代码自动补全 一、概述/目的 eclipse…

解决:前端bootstrap的fileInput插件

项目场景: 帮朋友做一个后台管理系统遇到文件上传回显异常的问题。 项目是单体架构,没有前后端分离,前端使用的bootstrap3Thymeleaf。上传插件用的是fileInput。 问题描述: 上传没有问题,完成后点击编辑再次进入无…

从本地创建项目到 Gitee 提交的完整教程

1、本地创建一个新项目 2.进入想上传的项目的文件夹,然后右键点击git bash 3.初始化本地环境,把该项目变成可被git管理的仓库 4.添加该项目下的所有文件到暂存区 5.使用如下命令将文件添加到仓库中去 6.在gitee上创建以自己项目名称命名的空项目 7.将本地…

springboot结合elasticJob

先说一说什么是elasticJob。 ElasticJob是一个分布式任务调度的解决方案,它由俩个相互独立的子项目Elastic-job-lite和Elastic- job-cloud组成。 任务调度:是指系统为了自动完成特定任务,在任务的特定时刻去执行任务的过程。 分布式&#xf…

窗函数的选择

不同的窗函数实质上时对矩形窗进行了不同程度的加权得到的不同类型的窗函数。 将模拟角频率转换为了数字角频率 矩形窗旁瓣过大,两个频率的峰值相差较大,因此无法识别,可以使用旁瓣非常小的窗函数来进行分辨,只是想要达到相同的分…

(C++) this_thread 函数介绍

文章目录 &#x1f6a9;前言⭐std::this_thread&#x1f579;️get_id()&#x1f5a5;️Code&#x1f516;get_id介绍&#x1f3f7;️其他介绍 &#x1f579;️sleep_for<>()&#x1f5a5;️Code&#x1f516;sleep_for介绍&#x1f3f7;️其他介绍 &#x1f579;️sleep…

python基础语法--列表

一、列表的概念 列表&#xff08;List&#xff09;是一种有序、可变、允许重复元素的数据结构。列表用于存储一组相关的元素&#xff0c;并且可以根据需要动态地进行增加、删除、修改和访问。以下是列表的主要特点和操作&#xff1a; 有序性&#xff1a; 列表中的元素是按照它…

最新AI创作系统ChatGPT网站源码Midjourney-AI绘画系统,Suno-v3-AI音乐生成大模型。

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…

【CVPR2024】文本到图像的行人再识别中的噪声对应学习

这篇论文的标题是《Noisy-Correspondence Learning for Text-to-Image Person Re-identification》,作者是来自中国四川大学、英国诺森比亚大学、新加坡A*STAR前沿人工智能研究中心和高性能计算研究所的研究人员。论文主要研究了文本到图像的行人再识别(Text-to-Image Person…

Unity进阶之ScriptableObject

目录 ScriptableObject 概述ScriptableObject数据文件的创建数据文件的使用非持久数据让其真正意义上的持久ScriptableObject的应用配置数据复用数据数据带来的多态行为单例模式化的获取数据 ScriptableObject 概述 ScriptableObject是什么 ScriptableObject是Unity提供的一个…

Windows抛弃历史包袱:可能带来哪些改善?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「 Windows的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;性能提升固然重要&#xff0…

[NSSCTF]-Reverse:[HUBUCTF 2022 新生赛]simple_RE(base64换表)

无壳 查看ida 可以看得出是base64&#xff0c;而且是换表的。 完整exp&#xff1a; import base64 result5Mc58bPHLiAx7J8ocJIlaVUxaJvMcoYMaoPMaOfg15c475tscHfM/8 biaostr.maketrans(qvEJAfHmUYjBacu8Ph5n9Od17FrICL/X0gVtM4Qk6T2z3wNSsyoebilxWKGZpRD,ABCDEFGHIJKLMNOPQR…

BUUCTF---misc---[SWPU2019]我有一只马里奥

1、下载附件是一个.exe文件 2、运行之后可以看到桌面生成了1.txt文件&#xff0c;文件里面有如下内容 3、经过信息搜索&#xff1a;NTFS&#xff08;New Technology File System&#xff09;是一种由Microsoft开发的专有日志文件系统。根据它的提示&#xff0c;应该是把flag.tx…

编译原理 LR(0)

讲解视频&#xff1a;编译原理LR&#xff08;0&#xff09;分析表&#xff08;上&#xff09;_哔哩哔哩_bilibili 【编译原理】LR(0)分析表分析输入串_哔哩哔哩_bilibili 拓广文法 已知G&#xff1a;S->(S)S | ε 拓广文法&#xff1a; S -> S S -> (S)S S -> ε…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(二)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 3 - 4节&#xff09; P3《开发准备-了解ArkTS》 鸿蒙开发主要是用来开发移动端应用的。 以前我们开发移动端应用的代码&#xff…

嵌入式4-24

作业&#xff1a; 整理思维导图 定义一个矩形类Rec&#xff0c;包含私有属性length&#xff0c;width&#xff0c;有以下成员函数&#xff1a; void set_length(int l); //设置长度 void set_width(int w); //设置宽度 int get_length(); //获取长度 int get_width(); //获取宽…

【Spring】IOC/DI中常用的注解@Order与@DependsOn

目录 1、Order 注解改变Bean自动注入的顺序 1.1、了解SpringBootTest注解 1.2、Order 注解改变Bean自动注入的顺序 2、DependsOn 改变Bean的创建顺序 1、Order 注解改变Bean自动注入的顺序 在sping中&#xff0c;通过IOC&#xff08;控制反转&#xff09;和DI&#xff08;依…