C++——引用

news2024/7/6 18:55:43

 

引用的概念

初步理解:引用相当于给变量取了一个别名,它和引用的变量共用同一块空间。

就好比孙悟空有很多外号,例如孙行者,齐天大圣,斗战胜佛,但是它们所指都是孙悟空。同样的,如果齐天大圣大闹天宫,那么孙悟空也大闹天宫,所以引用改变了,相应的变量的值也改变了

int main()
{
	int a = 0;
	int& n = a;
	n = 10;
	cout << n << endl;//输出10
	return 0;
}

引用的特性

  • 引用在定义时必须初始化
  • 一个变量可以有多个引用
  • 引用一旦有一个实体就不能有其他实体
int main()
{
	int tmp = 10;
	int a = 0;
	int& n = a;
	n = tmp;//将tmp的值赋给n引用的变量
	int& x = a;
	cout << x << endl << n << endl;//都是10
	return 0;
}

常引用

const int a = 10;
//int& ra = a; //权限不能扩大,a有常属性,引用也要有常属性
const int& ra = a;
int tmp = a;    //这是赋值,不会报错

//int& rb = 10; //权限不能扩大,10是常量,引用要有常属性
const int& rb = 10;

double d = 1.5;
//int& rd = d; 
//d是double类型,与rd引用的类型不同,在被引用时,会先放到一个有常属性的临时变量里截断,再被rd引用
const int& rd = d;
double& rrd = d; 

使用场景

  • 作函数参数

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

int main()
{
	int e1 = 1;
	int e2 = 10;
	cout << "交换前:" << "e1=" << e1 << " e2=" << e2 << endl;
	Swap(e1, e2);
	cout << "交换后:" << "e1=" << e1 << " e2=" << e2 << endl;
	return 0;
}

引用作参数可以改变实参的值,与C语言中的指针效果相同

引用做参数还可以提高效率,遇到空间较大的变量不需要拷贝

  • 作函数返回值

int& fun1(int n = 0)
{
	static int a = n;
	a++;
	return a;
}

int fun2(int n = 0)
{
    int a = n;
    a++;
    return a;
}

int main()
{
	int n = fun1(11);
	cout << n << endl;
    n = fun2(11);
	cout << n << endl;
	return 0;
}

引用作函数返回值时,要保证函数调用结束栈帧销毁后,返回的变量不被释放,例如使用静态变量

引用作函数返回值,可以提高效率。fun2函数返回a时,由于函数栈帧被销毁,会先将a的值传给一个临时变量,再将临时变量传给n,这会涉及两次变量的拷贝。fun1函数返回引用就不会拷贝。

引用的底层逻辑就是指针

引用的底层使用了指针,看下面这段代码:

int main()
{
	int a = 0;

	int& qa = a;
	qa = 10;

	int* pa = &a;
	*pa = 10;
}

汇编代码: 

 

引用和指针的区别

  • 引用必须初始化,指针不用
  • 引用初始化引用一个实体后不能成为其他实体的引用,而指针可以指向不同的实体
  • 没有NULL引用,但是由有NULL指针
  • sizeof()的结果不同,引用会返回引用类型的大小,指针会返回指针变量的大小(4/8)
  • 引用自加就是变量的值+1,指针是向后偏移一个类型的大小
  • 有多级指针但是没有多级引用
  • 访问实体时,指针需要解引用,引用可以直接显示使用
  • 引用使用更安全

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

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

相关文章

如何在 Ubuntu 22.04 上安装 Python Pip?

Python Pip 是 Python 的包管理器&#xff0c;它允许您轻松地安装和管理 Python 包和库。在 Ubuntu 22.04 上安装 Python Pip 是非常简单的。 本文将详细介绍如何在 Ubuntu 22.04 上安装 Python Pip&#xff0c;并为您提供逐步指南。 步骤 1&#xff1a;更新软件包列表 在安装…

C Primer Plus第八章编程练习答案

学完C语言之后&#xff0c;我就去阅读《C Primer Plus》这本经典的C语言书籍&#xff0c;对每一章的编程练习题都做了相关的解答&#xff0c;仅仅代表着我个人的解答思路&#xff0c;如有错误&#xff0c;请各位大佬帮忙点出&#xff01; 1.设计一个程序&#xff0c;统计在读到…

Yum使用方法

1.什么是软件包 在Linux下安装软件&#xff0c;有三种方法&#xff1a; 通过对源代码进行封装&#xff0c;并进行编译&#xff0c;得到可执行程序。rpm安装&#xff0c;rpm安装软件需要各种指令&#xff0c;对于小白来说不友好&#xff0c;容易出错。yum安装&#xff0c;解决…

六、Docker仓库之Harbor搭建(三)

Harbor搭建 一、Harbor简介 1.Harbor介绍 Harbor是一个用于存储Docker镜像的企业级镜像服务器&#xff0c;通过添加一些企业必需的功能特性&#xff0c;如安全、标识和管理等&#xff0c;大大扩展其功能。作为一个企业级私有镜像服务器&#xff0c;Harbor提供了更好的性能和安…

Modern CSV:大型 CSV 文件编辑器/查看器 Crack

Modern CSV用于快速查看大型 CSV 文件 适用于 Windows、Mac 和 Linux 的复杂 CSV 编辑器/查看器 被使用 电子商务运营商。数据科学家。会计师。 IT 专业人员。学生。医学研究人员。数字营销人员。生物学家。工程师。 现代 CSV 是适用于 Windows、Mac 和 Linux 的功能强大的表格…

SSM 如何使用 TCC 机制实现分布式事务?

SSM 如何使用 TCC 机制实现分布式事务&#xff1f; 分布式事务是现代分布式系统中必不可少的一部分&#xff0c;而 TCC 机制&#xff08;Try-Confirm-Cancel&#xff09;是一种常用的分布式事务处理方式。在 SSM 框架中&#xff0c;我们可以使用 TCC 机制来管理分布式事务。本…

RabbitMQ系列-概念及安装

1. 消息队列 消息队列是指利用队列这种数据结构进行消息发送、缓存、接收&#xff0c;使得进程间能相互通信&#xff0c;是点对点的通信 而消息代理是对消息队列的扩展&#xff0c;支持对消息的路由&#xff0c;是发布-订阅模式的通信&#xff0c;消息的发送者并不清楚消息的…

Spring源码解析

Idea导入Spring源码 下载 下载gradle 因为Spring源码里没有使用Maven依赖&#xff0c;而是使用gradle依赖&#xff0c;所以我们需要在本地下载安装并配置gradle环境。注意&#xff0c;这里下载安装的gradle版本应与Spring源码中的gradle版本对应。这里推荐下载我的&#xff…

Linux网络服务:部署YUM仓库与NFS服务

目录 一、理论 1.部署YUM仓库服务 2.NFS共享存储服务 二、实验 1.通过httpd服务建立yum仓库 2.通过vsftpd服务建立yum仓库 3.搭建NFS实现2台或3台服务器共享一个目录 一、理论 1.部署YUM仓库服务 (1) YUM简介 YUM的前身是YUP&#xff0c;借助于YUM软件仓库&#xff0c…

关于原型链

1-__proto__([[Prototype]])和prototype 每个对象都有一个隐式原型&#xff0c;这个隐式原型可以通过 obj.__proto__ Object.getPrototypeOf(obj)这两种方式获取&#xff1b; 我们都知道对象是通过构造函数构造的&#xff0c;new关键字构造的&#xff0c; 构造函数上有一个显…

如何在华为OD机试中获得满分?Java实现【最佳对手】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述4. Java算法源码5. 测试6.解题思路1. 题目描述 游戏里面,队伍通过匹配…

native层函数没有导出时,如何获得相应函数地址?

前言 每次App重新运行后native函数加载的绝对地址是会变化的&#xff0c;唯一不变的是函数相对于基地址的偏移&#xff0c;因此我们可以在获取模块的基地址后加上固定的偏移地址获取相应函数的地址&#xff0c;Frida中也正好提供了这种方式&#xff1a;先通过Module.findBaseA…

SQL教程1

SQL 是用于访问和处理数据库的标准的计算机语言。 在本教程中&#xff0c;您将学到如何使用 SQL 访问和处理数据系统中的数据&#xff0c;这类数据库包括&#xff1a;MySQL、SQL Server、Access、Oracle、Sybase、DB2 等等。 SQL 简介 SQL (Structured Query Language:结构化…

OSPF协议

OSPF&#xff1a;开放式最短路径优先协议 无类别IGP协议&#xff1b;链路状态型&#xff1b;基于LSA收敛&#xff0c;故更新量较大&#xff0c;为在中大型网络正常工作&#xff0c;需要进行结构化的部署 --- 区域划分、ip地址规划 组播更新 --- 224.0.0.5 224.0.0.6 支持等开销…

shell变量的使用 rhce(25)

目录 1.总结变量的类型及含义&#xff1f; 2.实现课堂案例计算长方形面积&#xff1f;&#xff08;6种方式&#xff09; 3.定义变量urlhttps://blog.csdn.net/weixin_45029822/article/details/103568815&#xff08;通过多种方法实现&#xff09; &#xff08;1&#xff0…

Redis的数据过期策略

数据淘汰策略-使用建议 1.优先使用allkeys-lru策略。充分利用LRU算法的优势&#xff0c;把最近最常访问的数据留在缓存中。如果业务有明显的冷热数据区分&#xff0c;建议使用。 2.如果业务中数据访问频率差别不大&#xff0c;没有明显冷热数据区分&#xff0c;建议使用allkeys…

【AUTOSAR】 AUTOSAR整体开发流程(六)---- ISOLAR与Simuink

ISOLAR与Simuink交互 8.1 AutoSar的几种开发流程 8.2 Simulink 到ISOLAR Simulink生成SWC arxml SWC arxml放到ISOLAR文件夹 F5即可显示 8.3 ISOLAR到Simulink 1、Matlab的几个命令 1&#xff09;importer Call the constructor arxml.importer to create an importer obj…

Nomad 会替代 Kubernetes 吗?对比一下,两者如何选择?

概 述 根据市场状况&#xff0c;Kubernetes&#xff08;又称“K8s”&#xff09;已经成为容器编排之王&#xff0c;超越了Docker Swarm和Mesos等竞争对手。但是&#xff0c;在K8s&#xff08;2014&#xff09;出现的同时&#xff0c;还有另一个编排项目HashiCorp的Nomad&…

同城跑腿系统源码,点对点配送,帮你省时省力

随着互联网的发展&#xff0c;越来越多的人开始依赖网络来解决生活中的各种问题。而同城跑腿系统就是其中一个受欢迎的解决方案。 ​同城跑腿系统是指一种基于互联网的服务&#xff0c;通过在线平台将用户和服务提供者连接起来&#xff0c;以便用户可以轻松地安排他们的日常任务…

Selenium Grid- 让自动化分布式执行变得可能

什么是 Selenium Grid&#xff1f; Selenium Grid 是 Selenium 的三大组件之一&#xff0c;允许用户同时在不同的机器和系统上测试不同浏览器。 也就是说 Selenium Grid 支持分布式的测试执行。它可以让你的测试用例在一个分布式的执行环境中运行。 由上图可见&#xff0c;测试…