C++中引用详解!

news2024/11/25 1:56:07

前言:

本文旨在讲解C++中引用的相关操作,以及引用的一些注意事项!搬好小板凳,干货来了!

引用的概念

何谓引用呢?引用其实很容易理解,比如李华这个同学,他因为很调皮,所以被老师起了个别名叫小孬,那么假如你问小孬作业写完了么,小孬说写完了,那么本质上是李华写完了作业,只是用小孬这个名字代替了李华这个称谓!

注:引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。


1.引用的定义

引用如何定义呢,定义引用其实很简单,只需要一个类型名+&+对象名=引用实体!

例如:

在本实例中,因为a,c的地址相同,说明二者存在引用和被引用的关系!所以c就是对变量a的引用。

注:引用类型必须和引用实体是同类型的,如本例题中,实体a的类型为int型,引用类型也是int型!


2.引用特征

1. 引用在定义时必须初始化

2. 一个变量可以有多个引用

3. 引用一旦引用一个实体,再不能引用其他实体


3.常引用

常引用的概念 :如果既要利用引用来提高程序的效率,又想要保护传递给函数的数据不能在函数中被改变,就应使用常引用!

例子如下:

只需要将int &b前加一个修饰const即可编译成功!

更改代码如下:

常引用相关的注意事项还有如下:


4.常引用的使用场景

既然介绍了常引用的一些用处,那么其有哪些相关使用场景呢?

1.做参数!

例如,平常我们使用的交换两个数据的值,我们可以一般可以使用指针进行交换,那么既然学到了引用的概念,那么我们当然也可以使用引用来进行交换两个数据的值!

void Swap(int& a, int& b)
{
	int tem = a;
	a = b;
	b = tem;
}

int main()
{
	int a = 3;
	int b = 4;
	Swap(a, b);
	cout <<"a=" << a << endl;
	cout <<"b=" << b << endl;
}

2.做返回值

int& Add(int a, int b)
{
int c = a + b;
return c;
}


int main()
{
int& ret = Add(1, 2);   因为ret也是引用类型,所以都是对Add这个栈帧的管理!第一次执行结果为3!
Add(3, 4);    //再次调用Add结果为7!
cout << "Add(1, 2) is :"<< ret <<endl;
return 0;
}

注意:如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。显然上面这个例子是一个错误的例子,目的就是为了表明当函数出作用域时,不能再使用引用返回了!



5.引用和指针的区别


注:在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。

1. 引用概念上定义一个变量的别名,指针存储一个变量地址。

2. 引用在定义时必须初始化,指针没有要求。

3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体!

4. 没有NULL引用,但有NULL指针

5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)

例子如下:

6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小

7. 有多级指针,但是没有多级引用

8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理

9. 引用比指针使用起来相对更安全


6.传值、传引用效率比较

以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低!
 


至此,关于引用的相关介绍完成,感谢各位的支持,欢迎大家积极评论,认真回读评论,回访大家!

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

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

相关文章

大模型时代下向量数据库的创新与变革

前言&#xff1a; 在当今信息时代&#xff0c;数据库扮演着关键的角色&#xff0c;用于存储和管理各种类型的数据。向量数据库是一种专门设计用于高维数据存储和快速检索的数据库系统。在不断创新和变革后&#xff0c;腾讯云不久前发布了AI原生&#xff08;AI Native&#xff0…

Vue3 + 百度地图实现位置选择,获取地址经纬度

Vue3 百度地图实现位置选择&#xff0c;获取地址经纬度 需求&#xff1a;添加传感器时&#xff0c;需要选择传感器所在的省、市、区、详细地址、以及传感器的经纬度信息。解决方案&#xff1a;集成百度地图API&#xff0c;通过在地图上搜索或者点击获取传感器的具体位置信息。…

什么是敏捷工作流程?如何实施?

依赖传统的项目管理流程&#xff08;即使它们效率不高&#xff09;&#xff0c;会阻碍团队协作&#xff0c;难以管理不断变化的项目需求。 而另一方面&#xff0c;现代项目管理方法&#xff08;如敏捷工作流程&#xff09;为项目带来了简单性、自主性和高效性。它能帮助你了解…

TSINGSEE青犀视频AI算法助力构建城市市容·街面秩序管理解决方案

随着城市化进程加快&#xff0c;未经合理规划设置自然形成的马路市场越来越多&#xff0c;这不仅存在交通安全隐患&#xff0c;也造成了市容秩序混乱&#xff0c;严重影响城市市容面貌。 TSINGSEE青犀AI智能分析网关V3内部部署了几十种算法&#xff0c;包括人脸、人体、车辆、…

fastjson漏洞复现

文章目录 启动环境漏洞复现下载bp插件漏洞扫描dnslog测试是否向外请求资源用工具构造rmi服务器 反弹shell 启动环境 到vulhub目录下 cd vulhub/fastjson/1.2.24-rce安装环境并启动&#xff1a; sudo docker-compose up -d && sudo docker-compose up -d启动成功&…

索尼 toio™ 应用创意开发征文|toio™——激发儿童创造力的创意玩具

导语&#xff1a; toio™是一种激发儿童创造力的创意玩具&#xff0c;它以简洁的设计和多功能性能为特点&#xff0c;为孩子们提供了一个探索和发展创意的平台。本文将探讨toio™玩具的创意方向&#xff0c;以及它如何帮助儿童开发创造力和想象力。 toio™——激发儿童创造力的…

苹果电脑好用的剪切板管理工具 Paste激活中文版最新

Paste是一款剪切板工具&#xff0c;可帮助用户更有效地管理和利用剪贴板中的内容。Paste支持Mac和iOS设备&#xff0c;并提供了一系列功能和特点&#xff0c;以提高工作效率和组织性。 以下是Paste的主要特点和功能&#xff1a; 1. 剪贴板历史记录&#xff1a;Paste记录并存储…

性能测试 —— 吞吐量和并发量的关系? 有什么区别?

吞吐量&#xff08;Throughput&#xff09;和并发量&#xff08;Concurrency&#xff09;是性能测试中常用的两个指标&#xff0c;它们描述了系统处理能力的不同方面。 吞吐量&#xff08;Throughput&#xff09; 是指系统在单位时间内能够处理的请求数量或事务数量。它常用于…

电器布线电线电缆外贸出口UL758测试标准

UL 758&#xff0c;第 3 版&#xff0c;2014 年 5 月 2 日- UL 安全电器布线材料标准 这些要求涵盖了电器布线材料 (AWM)&#xff0c;形式为单绝缘导体、多导体电缆、光纤、独立绝缘导体和光纤用作多芯电缆组件的构件。 本标准要求所涵盖的器具布线材料仅用作器具和其他设备整…

【设计模式】一、设计模式七大原则

文章目录 设计模式概述设计模式七大原则设计模式的目的设计模式七大原则1. 单一职责原则2. 接口隔离原则3. 依赖倒转(倒置)原则4. 里氏替换原则5. 开闭原则&#xff08;Open-Closed Principle简称OCP原则&#xff09;6. 迪米特法则7. 合成复用原则&#xff08;Composite Reuse …

深入探讨Java Stream流:数据处理的新思维

文章目录 1. 流式思想1.1 输入流与输出流1.2 Stream流 2. 使用Stream流的步骤3. 获取Stream流3.1 容器3.2 数组 4. Stream流中间操作方法4.1 filter(Predicate<? super T> predicate)4.2 limit(long maxSize)4.3 skip(long n)4.4 distinct()4.5 sorted() 和 sorted(Comp…

记录一次IDEA非法字符‘\ufeff‘报错

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 报错以及Bug ✨特色专栏&#xff1a; …

Python之作业(二)

Python之作业&#xff08;二&#xff09; 作业 求100以内的奇数和求100以内斐波那契数列 其数值为&#xff1a;1、1、2、3、5、8、13、21、34&#xff0c;从第三位数开始&#xff0c;每个数都是前两个数相加的和。 求斐波那契数列第101项打印如下菱形 ********* ************…

ctfshow-web-红包题 耗子尾汁

0x00 前言 CTF 加解密合集CTF Web合集网络安全知识库 文中工具皆可关注 皓月当空w 公众号 发送关键字 工具 获取 0x01 题目 0x02 Write Up 首先看到又是一道代码审计的题目。有两个参数一个是a一个是b&#xff0c;判断a是否调用限制方法&#xff0c;如果没有则将b当做参数给…

计算机硬件基础与CPU工作原理

应用开发&#xff1a; 使用系统提供的接口&#xff08;API&#xff09;&#xff0c;做上层应用程序的开发 底层开发&#xff1a; 即做操作系统本身的开发&#xff1b; Linux子系统&#xff08;5部分&#xff09;&#xff1a; 1.进程管理&#xff1a;管理进程的创建、调度、…

关于测试的思考-测试驱动开发

一、TDD实践 2、灵活应用活文档 推荐书籍《活文档与代码共同演进》

idea2021.1.3版本双击启动,没反应

今天打开电脑&#xff0c;点开idea&#xff0c;界面悬在这里&#xff0c;几秒然后就是没了。然后就一直打不开idea了。 然后又是卸载重装&#xff0c;又是删除缓存文件。我把电脑关于idea的文件全都删除了 。重新安装后&#xff08;首次运行倒是可以打开&#xff0c;但是关掉id…

波卡生态重要动态一览:w3ndi 推出,首尔、新加坡、里斯本活动接踵而至

Web3 市场冷却&#xff0c;但新的社区合作与推进仍在发生&#xff0c;技术和产品依然不断迭代。OneBlock 为你介绍波卡生态近期值得你关注的动态&#xff0c;以及接下来重要的行业活动。 波卡生态重要进展 1、最新 Referendum#110&#xff0c;提议对验证器配置进行多项修改&a…

如何解决国标GB28181视频平台EasyGBS国标云服务平台设备在线,通道却显示离线的情况

EasyGBS是基于国标GB28181协议的视频平台&#xff0c;可支持视频直播、录像、云存储、检索与回放、云台控制、告警上报、语音对讲等功能。EasyGBS平台功能全面、综合性强、视频能力灵活&#xff0c;能够涵盖所有视频监控领域的需求&#xff0c;已经在大量的项目中落地应用&…

【计算机网络】UDP协议详解

目录 前言 端口号的拓展 端口号范围划分 netstat pidof UDP协议 UDP协议端格式 UDP的特点 面向数据报 UDP的缓冲区 UDP使用注意事项 基于UDP的应用层协议 前言 我们前面讲完了http和https协议&#xff0c;它们都属于应用层&#xff0c;按照TCP/IP五层模…