C++|引用篇

news2024/11/13 15:19:32

目录

引用概念

引用的用法

做函数形参

优点一

优点二

引用做返回值

让我们更深入的了解引用与指针

语法层引用与指针完全不同的概念

站在底层的角度看指针与引用


引用概念

在语言层面上:引用不是定义新的变量,而是给已存在变量再取一个别名,编译器不会为引用新开一个空间,他和他的引用的变量共用一块内存空间,

如李逵在家叫“铁牛”在外叫“黑旋风”

看代码,为a取别名

int main()
{
    int a = 10;
    int&b = a;//为a取别名b
    return 0;
}

内存查看

打开内存发现他们都是一个地址。

会发现a,b地址相同

他们的地址都是相同的,所以我们可以认为引用并没有开空间,也只是在一块空间上多了个别名,依靠这个别名也可以访问该空间数据。

监控查看

我们更改别名的数据,同时也会把被取别名的数据更改

所以可以通过修改b的数据,从而修改a的数据。这里是十分重要的。

引用的用法

做函数形参

优点一

 这里的func1传值做参数,需要拷贝a的数据。

然而func2为引用做参数,无需拷贝数据,这_a为a的引用,用同一块空间

优点二

 引用可以通过改变形参来改变实参。(类似指针的用法)

引用做返回值

正常的函数返回值接收

int func()
{//....
    return 10;
 //....
}
    
//......
    int ret=func();
//..

有两个情况:

一、函数返回值为引用,接收变量不为引用,减少一次数据的拷贝。

 这里有个隐患,当func函数结束会销毁栈帧,OS回收数据,但是是否会重置数据就看编译器了。所以我们引用返回值尽量都是引用静态变量为返回值。

int&func()
{
    static int a=10;
    return a;
}

二、函数返回值为引用,接收变量也为引用,直接没有数据拷贝(两次都没有了)。

        这里引用的对象必须是static的变量,否者在未来,一旦有一次任意函数调用都有可能覆盖值。

        看我们的流程,既然ret是a的引用,哪为什么还要有临时空间呢?因为在函数结束后只要是return 数据,都一定要放入临时空间保存,无论是否是引用,因为一旦栈帧销毁了,我们就不能再去访问函数内的操作,所以这个时候就要靠临时空间将我们需要的数据带出来,可能是寄存器也可能是上一层栈帧的头部位置开空间做临时空间。在语言层面来看:临时空间不会开空间,并不是说可以取消临时空间


让我们更深入的了解引用与指针

语法层引用与指针完全不同的概念

指针:开空间,存放变量地址;

引用:不开空间,仅仅是变量的别名

//.Cpp
int main()
{
    int a=1;
    int& b=a;
    int*p=&a;
    b=2;
    *p=3;
    return 0;
}

上面的知识点可以看看,但是不要靠背他们

其实我更喜欢指针,可以看到细节,都在自己的掌控之中

站在底层的角度看指针与引用

先让我们学两个指令:

mov  a  b   将b数据放入给a中

lea    eax  a  将a的地址放入寄存器eax中

观察汇编代码,我们惊奇的发现:pa指向a与ra引用a的操作居然是一模一样的。

这里说明了,引用其实就是指针,但是他的操作逻辑操作不是我们程序员的事情,是编译器的事情。


所以虽然我们只要关注语言层面的引用,但是底层的引用我们也不能不知道。

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

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

相关文章

Spring——读取和存储(包含五大注解,对象装配,注入关键字)

目录 一、创建Spring项目 1. 创建一个普通的maven项目 2. 添加Spring框架支持(spring-context,spring-beans) 3. 添加启动类 二、Bean对象的读取和存储——不使用注释版 1. 创建Bean 2. 将Bean注册到容器 3. 获取并使用Bean对象 3.1…

Faster RCNN系列——Anchor生成过程

一、RPN模块概述 RPN模块的输入、输出如下: 输入:feature map(输入图像经过特征提取网络后得到的特征图)、物体标签(训练集中所有物体的类别和边框信息)输出:Proposal(生成的建议框…

KD-2125地下管线故障测试仪

一、产品概述 KD-2125电缆综合探测仪(管线仪)可进行地下电缆线路(停电/带电)和金属管道等敷设路径探测、识别、埋深测量;以及路灯电缆、地埋线路的故障查找等,同时也可进行地下带电线缆排查。该设备以其优越…

Android---内存性能优化

内存抖动 内存抖动是由于短时间内有大量对象进出新生区导致的,内存忽高忽低,有短时间内快速上升和下落的趋势,分析图呈锯齿状。 它伴随着频繁的 GC,GC 会大量占用 UI 线程和 CPU 资源,会导致 APP 整体卡顿(…

07 dubbo源码学习_集群Cluster

1. 入口2. 源码分析2.1 FailbackClusterInvoker2.2 FailoverClusterInvoker 失败自动切换2.3 FailfastClusterInvoker 快速失败2.4 FailsafeClusterInvoker 失败安全2.4 FailsafeClusterInvoker 并行调用多个服务提供者,只要有一个返回,就立即响应3. 如何使用本篇主要介绍集群…

Python VTK STL 映射三维模型表面距离

目录 前言: 效果: 实现步骤: Code: 前言: 本文介绍了Python VTK映射三维模型表面距离,通过如何使用VTK计算两个三维模型(stl)的表面距离,并将其距离值以颜色映射到模型,可用于对比 两相模型…

智慧养老平台建设方案word

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除。 1、 总体设计 1.1 建设原则 养老机构智能化管理工程是一项涉及多学科知识的复杂的系统工程,养老机构智能化管理围绕机构发展战略,立足机构需求&…

超星项目er图,进程

一.er图 二. 进程:发现之前的写的分类太乱而且服务端与客户端未分离,于是分离客户端与服务端,然后将客户端的界面三个程序整理放在三个包下,在服务端与客户端的数据交互方面采用序列化与反序列化进行功能判断采用以及数据传输&a…

WPF入门教程(六)--依赖属性(2)--属性值优先级与继承

一、 依赖属性的优先级 由于WPF 允许我们可以在多个地方设置依赖属性的值,所以我们就必须要用一个标准来保证值的优先级别。比如下面的例子中,我们在三个地方设置了按钮的背景颜色,那么哪一个设置才会是最终的结果呢?是Black、Re…

【论文阅读】On clustering using random walks

《On clustering using random walks》阅读笔记 1. 问题建模 1.1 问题描述 let G(V,E,ω)G(V,E,\omega)G(V,E,ω) be a weighted graph, VVV is the set of nodes, EEE is the edge between nodes in VVV, ω\omegaω is the function ω:E→Rn\omega&#xff1a…

网络基础2【HTTP、UDP、TCP】

目录 一.应用层 1.协议 2.网络版计算器 3.HTTP协议 (1)了解url和http (2)http的用处 (3)urlencode和urldecode (4)http协议格式 4.HTTPS协议 (1)加密…

《花雕学AI》用ChatGPT创造猫娘角色:人工智能角色扮演聊天对话的风险与对策

出于好奇心,我以“ChatGPT,调教猫娘”为题,开始了解ChatGPT角色扮演提示语的用法。ChatGPT给出的介绍是,调教猫娘是一种利用ChatGPT的角色扮演功能,让模型模仿一种类似猫的拟人化生物的行为和语言的活动,并…

【云原生网关】apisix使用详解

目录 一、apisix介绍 1.1 apisix是什么 二、apisix特点 2.1 多平台支持 2.2 全动态能力 2.3 精细化路由 2.4 对运维友好 2.5 多语言支持 三、apisix优势 3.1 apisix生态全景图 3.2 apisix定位 3.3 apisix优点 3.4 与nginx对比 四、apisix应用场景 4.1 Load Bala…

设计模式-结构型模式之桥接模式

2. 桥接模式2.1. 模式动机设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案:第一种设计方案是为每一种形状都提…

Python 基础(七):常用运算符

❤️ 博客主页:水滴技术 🌸 订阅专栏:Python 入门核心技术 🚀 支持水滴:点赞👍 收藏⭐ 留言💬 文章目录一、算术运算符二、按位运算符2.1 按位与 &2.2 按位或 |2.3 按位异或 ^2.4 按位取反…

Three.js教程:顶点颜色数据插值计算

推荐:将 NSDT场景编辑器 加入你3D工具链 其他工具系列: NSDT简石数字孪生 顶点颜色数据插值计算 上节课自定义几何体给大家介绍了一个顶点位置坐标概念,本节课给大家介绍一个新的几何体顶点概念,就是几何体顶点颜色。 通常几何体…

python学习笔记(二)IF、FOR、WHILE、break、continue、函数定义与调用、面向对象

笔记二 流程控制if条件语句for循环语句while循环语句break 和continue python 函数定义与调用函数与调用函数的脚本分离脚本模板函数参数匿名参数变量作用域全局变量与局部变量 python面向对象类的创建实例的创建属性、方法的访问属性的添加、删除和修改属性的访问python内置类…

( “树” 之 前中后序遍历 ) 144. 二叉树的前序遍历 ——【Leetcode每日一题】

基础概念:前中后序遍历 1/ \2 3/ \ \ 4 5 6层次遍历顺序:[1 2 3 4 5 6]前序遍历顺序:[1 2 4 5 3 6]中序遍历顺序:[4 2 5 1 3 6]后序遍历顺序:[4 5 2 6 3 1] 层次遍历使用 BFS 实现,利用的就是 BFS…

写不了博客了吗?

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

像素的奇妙冒险:使用 Python 玩转彩色图片的灰度处理

文章目录 参考描述模块PillowPILPillow获取 Numpy获取 使用 Pillow 实现图片的灰度处理ImageOps.grayscale()convert() 原理灰度模式与彩色模式图片表示与三维数组ImageOps.grayscale() 与 convert(L) 背后的逻辑心理学灰度加权公式 Python 实现灰度模式下的灰度图片彩色模式下…