C++的引用

news2024/11/16 4:22:51

目录

引用概念

引用的用法

做函数形参

优点一

优点二

引用做返回值

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

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

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


笔记类型文章

引用概念

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

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

看代码,为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/446774.html

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

相关文章

大模型带来的Web复兴,会是昙花一现吗?

大家是不是对GPT、对话式AI、生成式AI之类的话题,已经有点审美疲劳了? 写这篇文章之前,我有点犹豫,究竟还要不要接着讨论GPT了。最终决定写,是觉得个人用户、开发者,以及正在紧锣密鼓训大模型的AI公司和云厂…

Go | 一分钟掌握Go | 1 - 安装Go

作者:Mars酱 声明:本文章由Mars酱原创,部分内容来源于网络,如有疑问请联系本人。 转载:欢迎转载,转载前先请联系我! 为什么学Go 为什么要学Go?网上太多广告和说辞了,什…

“SCSA-T学习导图+”首发:路由技术之OSPF入门

本期引言: 路由技术是网络环境中,为不同的节点传输数据提供传输路径的技术,企业网络的拓扑一般会比较复杂,不同的部门或者总部和分支可能处于不同的网段中,此时就需要使用路由协议来连接不同的网段,实现数…

django channels(websocket)的使用,实现网页间实时聊天

目录 一、创建项目mysite和应用chat 1. 创建项目mysite 2. 创建应用chat并添加应用到settings.py的INSTALLED_APPS中 3. 添加模板文件 4. 添加视图及路由 5.配置根路由指定chat应用的路由 6. 集成channels 二、实现聊天服务器 1. 创建一个新文件chat/templates/chat/r…

响应式开发HTNL5CSS3视频播放器

目录 前言 一、本视频播放器需要实现的功能 ​二、代码分布结构 三、部分主要代码 1.index01.html 2.video1.css 3.video1.js 四、images图片资源及视频 五、运行效果 前言 1.本文讲解的响应式开发技术(HTML5CSS3Bootstrap)的HTML5视频播放器等…

TS-黑马(二)

目录: (1)ts-类型-字面量与nullish类型 (2)ts-类型-泛型 (3)ts-意义 (4)ts-class语法 (1)ts-类型-字面量与nullish类型 我们子啊传递参数的时…

以 100GB SSB 性能测试为例,通过 ByteHouse 云数仓开启你的数据分析之路

动手点关注 干货不迷路 I. 传统数仓的演进:云数仓 近年来,随着数据“爆炸式”的增长,越来越多的数据被产生、收集和存储。而挖掘海量数据中的真实价值,从其中提取商机并洞见未来,则成了现代企业和组织不可忽视的命题。…

总的所有的全部的完全的整个的整体的: all entire full gross whole total

all entire full gross whole total 所有的,完全的,完整的全部的,整个的,整体的,总的 all entire full gross whole total all entire full gross whole total一些词典的解释allentirefullgrosswholetotal 区别辨析entire、whole、complete、full、total、gross与alltotal&…

【JavaWeb】HTMLCSS

一:B/S 软件的结构 二:前端的开发流程 3、网页的组成部分 页面由三部分内容组成! 分别是内容(结构)、表现、行为。 内容(结构),是我们在页面中可以看到的数据。我们称之为内容。一般内容 我们…

【Linux】共享内存(shm)代码实现

文章目录 共享内存介绍最快的IPC形式共享内存示意图共享内存数据结构共享内存函数shmget函数shmfig shmat函数说明: shmdt函数shmctl函数 共享内存的原理小结 共享内存的特点生命周期共享内存的大小共享内存为什么快共享内存没有任何的保护机制即同步互斥扩展内容 代…

《软件开发本质论》读书笔记

目录 第一部分——价值的循环开发取向频繁交付小的,价值大,代价小的特性 测试同时要有业务测试和开发测试开发测试应在代码开发的同时完成甚至先于代码完成 重构第一部分总结 第二部分——说明与论述团队目的自主专精 五卡法预测软件计划控制好自己所参与…

二叉树一定是完全二叉树

一、树的概念及其结构 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 1、树的特点 ①有一个特殊的结点&…

ARM Coresight 及 DS-5 介绍 5 - ARM Cortex-M DS-5 加载 ELF 文件运行

文章目录 1.1.1 DS-5 工程创建1.1.2 DS-5 加载 ELF 脚本创建1.1.3 DS-5 脚本读写 Memory1.1.4 DS-5 扫描脚本 1.1.1 DS-5 工程创建 在使用ARM DS-5 连接 board(或者PFGA)之前首先需要能够扫描到相应的硬件信息,比如对应的cpu的相关信息:coresight 相关组…

【Zblog搭建博客网站】windows环境搭建属于自己的博客并发布上线 - cpolar内网穿透

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 转载自远程内网穿透的文章:【Zblog建站】搭建属于自己的博客网站&#…

【C++】初始化列表,explicit 关键字,静态成员

初始化列表 构造函数内可以对于成员的赋值,故不能称为是初始化,初始化只能初始化依次,C中类对象的初始化可由初始化列表完成 内置类型成员可以通过设置缺省值实现初始化,但对于const修饰的成员、引用成员、没有默认构造函数的自…

hive解析json

目录 一、背景 二、hive 解析 json 数据函数 1、get_json_object 2、json_tuple 3、使用嵌套子查询(exploderegexp_replacesplitjson_tuple)解析json数组 4、使用 lateral view 解析json数组 一、背景 我们进行ETL(Extract-Transfer-Load) 过程中,经常会遇到从不同数据…

编码拓展:链接库

一.认识链接库 1.1库 计算机中,有些文件专门用于存储可以重复使用的代码块,例如功能实用的函数或者类,我们通常将它们称为库文件,简称“库”(Library)。 以 C 语言为例,如下为大家展示的就是…

JUC高级十-并发加锁原理之AbstractQueuedSynchronizer(AQS)

1. 前置知识 公平锁和非公平锁可重入锁自旋锁LockSupport数据结构之双向链表设计模式之模板设计模式 AQS重要性 JAVA ------>JVM AQS ------>AQS 2. AQS入门级别理论知识 2.1 是什么? 2.1.1 字面意思 Abstract Queued Synchronizer----抽象的队列同步器 源码位置: …

【Microsoft Edge】如何彻底卸载 Edge

文章目录 一、问题描述二、卸载 Edge2.1 卸载正式版 Edge2.2 卸载非正式版 Edge2.2.1 卸载通用的 WebView22.2.2 卸载 Canary 版 Edge2.2.3 卸载其他版本2.3 卸载 Edge Update 2.4 卸载 Edge 的 Appx 额外安装残留2.5 删除日志文件2.6 我就是想全把 Edge 都删了 一、问题描述 …

预测模型的局部评价?

预测模型的局部评价 为什么要进行局部评价? 首先是临床决策曲线分析通常会给预测模型的使用规定一个阈值范围,相应地预测模型的评价也应该局限在这个范围之内才是合理的; 其次,全局性地评价往往不够敏感,即好的模型和坏…