C++ 引用

news2025/1/21 9:39:43

什么是引用

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。(语法层面来讲)

但在底层实际上引用是开辟空间的,类似于指针
在这里插入图片描述

使用

  1. 引用做参数
    (输出型参数)
    (减少拷贝提高效率)(大对象/深拷贝类对象)
void swap(int& a, int& b)
{
	int tmp = a;
	a = b;
	b = tmp;
}
void swap(int*& a, int*& b)
{
	int* tmp = a;
	a = b;
	b = tmp;
}
int main()
{
	int x = 11, y = 22;
	cout << x << " " << y << endl;
	swap(x, y);
	cout << x <<" " << y << endl;

	int* px = &x, * py = &y;
	cout << px << " " << py << endl;
	swap(px,py);
	cout << px << " " << py << endl;
	return 0;
}

  1. 引用做返回值
    (减少拷贝提高效率)(大对象/深拷贝类对象)
    修改返回值+获取返回值

引用返回被销毁的局部变量n,要小心
在这里插入图片描述

如果函数内部的变量出了函数作用域不消毁,那么就可以使用引用返回
在这里插入图片描述

回顾一下函数栈帧返回值是如何带回main函数的
在这里插入图片描述

把返回值拷贝到寄存器/临时空间带回调用函数中(寄存器放不下时,寄存器大小4byte 8byte)

为什么要开辟临时空间带回呢?
因为函数栈帧要被销毁,即使你销毁前把函数内部变量返回,返回的还是被销毁的变量

发现:静态区的变量带回也要开辟临时空间
在这里插入图片描述
在这里插入图片描述

总结:

1、基本任何场景都可以用引用传参。
2、谨慎用引用做返回值。出了函数作用域,对象不在了,就不能用引用返回,还在就可以用引用返回。

常引用----const修饰变量的引用

引用过程中,权限不能放大

int main()
{
	const int a = 0;
	int& b = a;
	return 0;
}

但权限可以平移或者缩小

int main()
{
	/*const int a = 0;
	int& b = a;*/

	int a = 0;
	int& b = a;
	const int& c = b;
	++a;
	printf("%d %d %d\n", a, b, c);
	return 0;
}

算术转换发生时的临时变量

操作符两边不同类型 发生截断或者提升 会保存到临时变量,因为不能改变原数据
在这里插入图片描述
这里虽然int& rii = dd的类型不同
还有另外原因是发生算术转换的临时变量具有常性,相当于权限提升,所以不行

修改:

	double dd = 1.11;
	int ii = dd;
	cout << ii << endl;
	
	const int& rii = dd;
	cout << rii << endl;

临时变量具有常性

在这里插入图片描述
临时变量x具有常性 ret1进行权限放大 是不可以的

修改:

int func1()
{
	static int x = 0;
	return x;
}

int main()
{
	 //int& ret1 = func1();  // 权限放大
	const int& ret1 = func1(); // 权限平移
	 int ret1 = func1();  // 拷贝

	return 0;
}

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

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

相关文章

大数据能力提升项目|学生成果展系列之八

导读 为了发挥清华大学多学科优势&#xff0c;搭建跨学科交叉融合平台&#xff0c;创新跨学科交叉培养模式&#xff0c;培养具有大数据思维和应用创新的“π”型人才&#xff0c;由清华大学研究生院、清华大学大数据研究中心及相关院系共同设计组织的“清华大学大数据能力提升项…

操作系统前置知识

进程 程序存储在磁盘之中&#xff0c;需要加载内存才能执行&#xff0c;包含堆空间、栈空间、全局和静态变量数据、代码&#xff0c;具体执行效果如下所示&#xff1a; 所谓的进程概念就是操作系统为了执行某个程序为其分配的内存资源&#xff0c;该内存资源并不是连续的&…

【数据结构】二叉树的链式结构(笔记总结)内附递归展开图(炒鸡详细)

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;数据结构 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&…

Web前端基础——盒子模型

&#xff08;1&#xff09;盒子模型的作用&#xff1a; 布局网页&#xff0c;摆放盒子和内容 &#xff08;2&#xff09;盒子模型重要组成部分&#xff1a; 内容区域 - width & height内边框 - padding&#xff08;出现在内容与盒子边缘之间&#xff09;边框线 - border外…

毕业2年,跳槽到下一个公司就25K了,厉害了···

本人本科就读于某普通院校&#xff0c;毕业后通过同学的原因加入软件测试这个行业&#xff0c;角色也从测试小白到了目前的资深工程师&#xff0c;从功能测试转变为测试开发&#xff0c;并顺利拿下了某二线城市互联网企业的Offer&#xff0c;年薪 30W 。 选择和努力哪个重要&a…

建模技能C位秘诀 | 装配式建筑操作技能

剪力墙结构PC构件-预制剪力墙 YUGOU SCHOOL 1、承载力计算&#xff1a;对一、二、三级抗震等级的装配式剪力墙结构&#xff0c;应进行剪力墙水平接缝的抗震受剪承载力验算。 由公式可以看出预制剪力墙水平抗剪主要是靠垂直穿过结合面的竖向抗剪钢筋以及结合面上的轴向压力&a…

RSA-2048-Encoded-Modulus

裸公钥和x509格式公钥的区别 (公钥&#xff0c;非证书) x509 30820122300D06092A864886F70D01010105000382010F003082010A02820101||00 || 256字节的modulus||0203010001 解析: 0203010001 tag length value 结构 &#xff0c;pubExponent 010001 大于7F补 00 &#xff1f;…

C++11多线程:原子操作std::automic-用于多个线程之间共享的变量。

系列文章目录 文章目录 系列文章目录前言一、std::automic二、使用步骤1.代码案例 总结 前言 原子操作std::automic的基本概念和用法。 一、std::automic std::atomic来代表原子操作&#xff0c;std::automic是个类模板。其实std::atomic这个东西是用来封装某个类型的值的。 …

常用 Composition API--ref函数

ref函数--处理基本类型 以前我们的ref属性用处主要用于打标识&#xff0c;像原生js中的id标签一样。我们可以通过这个ref函数可以实现获取input元素&#xff0c;并让他获取焦点触发事件 而在v3中的是ref函数 先提出一个例子&#xff0c;我点击一个按钮&#xff0c;但是页面并…

WordCount 在 MapReduce上运行详细步骤

注意&#xff1a;前提条件hadoop已经安装成功&#xff0c;并且正常启动。 1.准备好eclipse安装包&#xff0c;eclipse-jee-juno-linux-gtk-x86_64.tar.gz&#xff0c;使用SSH Secure File Transfer Client工具把安装包上传于Hadoop集群的名称节点。 2.上传Hadoop在eclipse上运…

C++缺省参数的具体使用

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】 本文来详细介绍C中的缺省参数。正文开始&#xff1a; 目录 一、缺省参数概念二、缺省参数分类2.1全缺省2.2半缺省 三、缺省参数…

Linux上搭建Discuz论坛

一.准备工作 1.下载php*&#xff0c;mariadb-server 2.上传Discuz3.5压缩包并解压 二.搭建过程 基于redhat 9 版本和Discuz3.5&#xff0c;php8.0&#xff0c;mariadb10.5演示 一.准备工作 1.下载php*&#xff0c;mariadb-server [rootredhat9 aaa]# yum install -y php*…

300元的蓝牙耳机什么牌子好?300内无线蓝牙耳机推荐

感受过无线的自在舒适后&#xff0c;越来越多的小伙伴爱上了蓝牙耳机白天出街更潇洒&#xff0c;目前市面上蓝牙耳机琳琅满目可选择性较多价格从几十、几百元到数千元不等然而蓝牙耳机的安全性、舒适性如何&#xff1f;连接稳吗&#xff1f;下面整理了几款300元价位的耳机分享给…

前端配置项

默认下载安装所需插件的时候会自动添加配置&#xff0c;但有时候可能需要自己去配&#xff0c;比如系统重装&#xff08;重装的是C盘&#xff0c;系统变量会丢失&#xff0c;软件在其他盘符并不需要重新下载&#xff09;。 前端开发涉及到需要配置变量的软件有&#xff1a;git…

JVM之GC日志解读

通过阅读Gc日志&#xff0c;我们可以了解Java虚拟机内存分配与回收策略。 内存分配与垃圾回收的参数列表 -XX:PrintGC 输出GC日志。类似&#xff1a;-verbose:gc -XX:PrintGCDetails 输出GC的详细日志 -XX:PrintGCTimestamps 输出GC的时间戳&#xff08;以基准时间的形式&#…

如何进行帕累托分析

【面试题】有一张“学生成绩表”&#xff0c;包含3个字段&#xff1a;学号、课程、成绩。 问题&#xff1a;找出每门课程A类和B类的学生&#xff0c;判断标准是累计占比&#xff0c;0~60%的记为A类&#xff0c;60%~85%记为B类 【解题思路】 什么是二八定律&#xff1f; 二八定律…

Java通过显示弹奏音乐的方式来实现继承的有关方法

目录 前言 一、Music.java类 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 二、Brass.java类 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 三、Wind.java类 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 四、Instrument.java类 1.1运行流程&…

世界领先的电动汽车国际标准 一 ISO 15118全系列

世界领先的电动汽车国际标准 一 ISO 15118全系列 ISO 15118 的官方名称是“道路车辆——车辆到电网的通信接口”。我可能有点偏见&#xff0c;因为我是该国际标准的共同作者之一&#xff0c;但我坚信 ISO 15118 是当今可用的最重要和面向未来的标准之一。 ISO 15118 中内置的…

C语言学习分享(第三次)------了解C语言-下

了解C语言-下 前言知识列表1. 函数1.1认识函数1.2 自己实现函数1.3 注意事项以及函数的好处 2. 数组2.1 认识数组2.2 数组的下标 3. 操作符3.1 算数操作符3.2 移位操作符和位操作符3.3 赋值操作符3.4 单目操作符3.5 关系操作符3.6 条件操作符3.7 逗号表达式 4. 常见关键字4.1 关…

开源正当时,共赢新未来 OpenHarmony开发者大会成功召开

4月19日&#xff0c;以“开源正当时&#xff0c;共赢新未来”为主题的开放原子开源基金会OpenHarmony开发者大会2023&#xff08;以下简称“大会”&#xff09;成功举办。 本次大会由开放原子开源基金会指导&#xff0c;OpenHarmony项目群工作委员会主办&#xff0c;华为、开鸿…