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

news2024/11/16 18:56:28

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使用完成之后,这个临时变量才会被销毁。

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

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

相关文章

【热议】硕士和读博士洗碗区别的两大理论

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验,帮助大家尽早适应研究生生活,尽快了解科研的本质。祝一切顺利!—…

SWOT分析法:知彼知己的战略规划工具

文章目录 一、什么是SWOT分析法二、SWOT分析法如何产生的三、SWOT分析法适合哪些人四、SWOT分析法的应用场景五、SWOT分析法的优缺点六、SWOT分析实例 一、什么是SWOT分析法 SWOT分析法是一种用于评估组织、项目、个人或任何其他事物的战略规划工具。SWOT是Strengths&#xff…

组态风格的工业可视化大屏,既同步状态又掌控数据,一箭双雕。

可视化大屏中加入了组态图,状态和数据一目了然了,我看还有谁说可视化大屏没啥用啦。 将组态图放入可视化大屏中可以起到以下几个作用: 1. 实时监控: 组态图可以用来实时监控设备、系统或者生产线的运行状态。通过大屏展示&#…

HackMyVM-Alzheimer

目录 信息收集 arp nmap FTP服务信息收集 匿名登陆 关键信息 knock WEB信息收集 信息收集 gobuster 目录爆破 ssh登录 提权 系统信息收集 提权 get root 信息收集 arp ┌──(root㉿0x00)-[~/HackMyVM] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC…

应用于智能装备制造,钡铼IOy系列模块展现其强大的灵活性和实用性

随着科技的飞速发展,智能制造已经成为工业4.0时代的核心驱动力。在此背景下,钡铼技术推出的IOy系列模块以其独特的设计、卓越的性能以及无可比拟的灵活性与实用性,在智能装备制造领域展现出了强大的技术优势和应用价值。 首先,钡…

Excel 冻结前几行

Excel中有冻结首航和冻结首列的选项,但是如果想冻结前几行该怎么操作? 冻结首行或冻结首列 视图 -> 冻结窗格 -> 冻结首行或冻结首列 冻结前几行或前几列 视图 -> 冻结窗格 -> 冻结拆分窗格 具体冻结几行和几列取决于当前选中的单元格。…

力扣HOT100 - 114. 二叉树展开为链表

解题思路&#xff1a; class Solution {List<TreeNode> list new ArrayList<>();public void flatten(TreeNode root) {recur(root);for (int i 1; i < list.size(); i) {TreeNode pre list.get(i - 1);TreeNode cur list.get(i);pre.left null;pre.right…

不同伦敦金网上平台的投资者都在使用的平仓技术

现在几乎是百分之一百的伦敦金交易都在伦敦金网上平台进行。市面上有不同的伦敦金网上平台&#xff0c;那有没有一些交易技术&#xff0c;不论是什么伦敦金网上平台的投资者都喜欢用的呢&#xff1f;答案是肯定的&#xff0c;下面我们就从平仓这个角度来讨论一下伦敦金网上平台…

LeetCode - 11.盛最多水的容器

一. 题目链接 LeetCode - 11.盛最多水的容器 二. 思路解释 利用双指针的思想&#xff0c;定义一个left和reght&#xff0c;left指向首部&#xff0c;right指向尾部&#xff0c;计算当前两个指针所对应的高度构成容器的体积。根据当前双指针所指的高度的大小&#xff0c;然后让…

精益人效,实践为先|第四届狮山人力资源论坛圆满举办

4月19日 &#xff0c;在苏州日航酒店&#xff0c;由中国苏州人力资源服务产业园、苏州高新区人力资源服务产业园指导&#xff0c;盖雅工场、盖雅学苑和盖雅人效研究院主办的 「精益人效 实践为先——第四届狮山人力资源论坛」圆满结束。 700余位企业管理者与人力资源从业者&am…

【每日刷题】Day23

【每日刷题】Day23 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 2. 链表的回文结构_牛客题霸_牛客网 …

邂逅JavaScript逆向爬虫-------基础篇之面向对象

目录 一、概念二、对象的创建和操作2.1 JavaScript创建对象的方式2.2 对象属性操作的控制2.3 理解JavaScript创建对象2.3.1 工厂模式2.3.2 构造函数2.3.3 原型构造函数 三、继承3.1 通过原型链实现继承3.2 借用构造函数实现继承3.3 寄生组合式继承3.3.1 对象的原型式继承3.3.2 …

zabbix6.4告警配置(短信告警和邮件告警),脚本触发

目录 一、前提二、告警配置1.邮件告警脚本配置2.短信告警脚本配置3.zabbix添加报警媒介4.zabbix创建动作4.给用户添加报警媒介 一、前提 已经搭建好zabbix-server 在需要监控的mysql服务器上安装zabbix-agent2 上述安装步骤参考我的上篇文章&#xff1a;通过docker容器安装za…

软考-系统集成项目管理中级--合同管理

本章历年考题分值统计(16年11月及以后按新教材考的&#xff09; 本章重点常考知识点汇总清单(学握部分可直接理解记忆) 8、合同签订管理(掌握)10下53&#xff0c;14上53&#xff0c;15上53 考题 签订合同的前期调查&#xff0c;每一项合同在签订之前&#xff0c;应当做好以下几…

Python蜘蛛侠

目录 写在前面 蜘蛛侠 编写代码 代码分析 更多精彩 写在后面 写在前面 本期小编给大家推荐一个酷酷的Python蜘蛛侠&#xff0c;一起来看看叭~ 蜘蛛侠 蜘蛛侠&#xff08;Spider-Man&#xff09;是美国漫威漫画宇宙中的一位标志性人物&#xff0c;由传奇创作者斯坦李与艺…

MySQL主从结构搭建

说明&#xff1a;本文介绍如何搭建MySQL主从结构&#xff1b; 原理 主从复制原理如下&#xff1a; &#xff08;1&#xff09;master数据写入&#xff0c;更新binlog&#xff1b; &#xff08;2&#xff09;master创建一个dump线程向slave推送binlog&#xff1b; &#xff…

javaScript中的作用域和作用域链

作用域&#xff08;Scope&#xff09; 什么是作用域 作用域是在运行时代码中的某些特定部分中变量、对象和函数的可访问性。 换句话说&#xff0c;作用域决定了代码区块中变量和其他资源的可见性。 示例&#xff1a; function outFun2() {var inVariable "内层变量2…

通过本机端口映射VMware中虚拟机应用(例如同一局域网别人想远程连接你虚拟机中的数据库)

需要 虚拟机中安装一下达梦数据库&#xff0c;并且以后大家都连接你虚拟机中达梦数据库进行开发。。。。。。在不改动自己虚拟机配置&#xff0c;以及本地网卡任何配置的情况下如何解决&#xff1f;本虚拟机网络一直使用的NAT模式。 解决 找到NAT设置添加端口转发即可解决。…

springboot+springsecurity+vue前后端分离权限管理系统

有任何问题联系本人QQ: 1205326040 1.介绍 优秀的权限管理系统&#xff0c;核心功能已经实现&#xff0c;采用springbootvue前后端分离开发&#xff0c;springsecurity实现权限控制&#xff0c;实现按钮级的权限管理&#xff0c;非常适合作为基础框架进行项目开发。 2.效果图…

AI创作系统Pro版,付费及流量主小程序源码搭建,抖音小程序项目分享,ai系统搭建运营。

AI技术可以激发新的创新思维和方法&#xff0c;在许多领域都能发挥重要作用。今天我们来讲述以下这款ai工具的作用以及可以延伸出什么互联网项目。 一、AI创作系统Pro系统功能 这款系统有AI写真&#xff0c;绘画&#xff0c;动 漫&#xff0c;音 乐&#xff0c;换 脸&#xf…