当前位置: 首页 > news >正文

C++中的引用

        在C++中,我们要学习一个新的概念,叫做引用。引用不是对象,它只是给变量取一个别名。就好比,我们每个人总会右一下外号,或者是小名。当朋友或者家长不管是直接叫你的名字,还是叫你的小名,你都会答应。

引用的概念和定义

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

        类型&引⽤别名=引⽤对象;

        C++中为了避免引入太多复杂的符号,所以这里的引用符号和取地址符号&是同一个符号,只不过它们的用法不同,含义也不同。我们还是敲代码来看一看吧。

        可以看到我们定义了一个变量a,我们使用b取引用它,现在b就是a的一个别名,然后们分别打印a,b 我们发现它们的值是相同的。下面我们再来看一看它们的地址是不是相同的呢?

        可以看到它们两个都指向的同一块空间,自然都是同一个值。

         一般在初始化变量时,初始值会被拷贝到新建的对象中。然而定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用和它的初始值对象就一直绑定在一起。因为无法令引用绑定到另外一个对象,因此引用必须要初始化。

        简单来说,引用在定义时就必须要初始化,然后它就无法改变引用对象了。

        需要注意的是,引用本身不是一个对象,所以不能定义引用的引用。但是我们可以给别名取别名。

        我们之后对引用进行操作也就是对它引用的对象进行操作。

        通过代码可以看到,我们通过修改b的值,也修改了a的值。

引用的使用

        引用在实践中主要用做引用传参和引用做返回值中减少拷贝提高效率和改变引用对象同时改变被引用对象。

        比如我们使用函数交换两个数的值时,我们学习了C语言,首先想到的就是使用指针去交换两个值的大小。而当我们学习了C++中的引用后,我们就可以使用引用去交换两个变量的值了。

        可以看到原来a=10,b=20,最后打印出的时候,a=20,b=10。说明两个变量的值已经得到了交换。 相比于以前使用指针去交换两个变量的值,我们使用引用就方便了许多。

        后面我们还会学习到引用作为返回值的使用,我们后面再学习。

Const限定符

        有时候我们希望定义这样一种变量,它的值不能被改变。所以我们用到了Const 限定符。根据它的中文翻译,它的意思是恒定的,不变的,无法修改的(const)。从而我们可以知道,当我们定义一个变量的时候,在它前面加上const可以防止它被修改。

初始化与const

        对象的类型决定了其上的操作。与非const类型所能参与的操作相比,const类型的对象能完成很大一部分,但也不是所有的操作都适合。主要的限制就是只能在const类型的对象上执行不能改变其内容的操作。但是其它操作,比如:赋值,参与计算,转化成bool值等。

        看 ,num已经被const修饰,我们尝试着去修改它,编译器给我们报错了,说表达式必须是可修改的左值。num本身是一个变量,但当我们使用const去修饰的时候,它就成为了一个常量,我们知道常量就是不能够修改的。 

const的引用

        可以把引用绑定到const对象上,就像绑定到其他的对象上一样,我们称之为常量引用。我们前面说过const可以让对象无法修改,可以理解为变成了常量。我们下面都用常量引用来说。

        对于常量引用来说,需要记住的就是,只能小范围去引用大范围。      

        可以看到 num是一个常量,只能读取它。而我们想让一个可读可写的别名去引用它,这样就可能导致从rnum去修改到num,这是绝对不允许发生的。

        我们再来看一看,当我们使用一个常量别名(只能读,不能修改)去引用num(能读,能写)着就是合法的。因为num是一个大范围,rnum是一个小范围。而上面那种情况就是大范围去引用小范围了就错了,就有点本末倒置的意思。人家本体都不能修改,你一个别名却想要修改它,这肯定是不被允许的。

常量指针和指针常量

        与引用一样,也可以令指针指向常量或非常量。类似于常量引用,指向常量的指针不能用于改变所指对象的值。

         我们还是通过代码来分析。

        我们只需要记住,指针必须要和指向的对象类型相同。如上图,因为num的类型是const int 型,我们学习过指针,所以pnum2的类型就应该是const int * 型 。所以说我们称这样指向常量的指针为" 常量指针"。

        下面我们来学习一下指针常量。顾名思义,指针就是一个常量,指针的值无法修改,那么它永远就只能指向一个对象了。     

        可以看到我们定义了两个变量,然后初始化的时候我们让pnum指向了num1,然后我们试图去修改pnum指向的空间,结果遭到了编译器的反对,报错,说指针是一个常量,无法修改。这就和前面的const修饰常量一样,类比一下,应该就很好理解。

        最后还有一种指向常量的常量指针。也就是说该指针既不能修改指向的值,也不能修改它自己所指向的对象。 这句话听起来有点复杂,多理解一下就行了。

指针和引用的主要区别

在C++中,指针和引用都是用于处理内存地址的概念,但它们之间有一些重要的区别:

  1. 指针可以被重新赋值或者指向不同的内存地址,而引用在被初始化后就不能再引用其他对象,因此引用一般被认为是别名。

  2. 指针可以为空(nullptr),即不指向任何内存地址,而引用必须引用一个有效的对象。

  3. 指针使用“*”来访问保存在其指向地址中的值,而引用直接使用变量名来操作对象的值,因此引用操作起来更加方便。

  4. 指针可以指向空间被释放的内存地址(悬空指针),而引用则总是指向有效的对象,避免了悬空引用的情况。

        总的来说,指针更加灵活,但使用引用可以在代码中更加清晰和直观地表达意图。在选择使用指针还是引用时,需要考虑代码的需求和设计,以及安全性和效率等因素。

        欢迎大家点赞+评论。

 

相关文章:

C++中的引用

在C中,我们要学习一个新的概念,叫做引用。引用不是对象,它只是给变量取一个别名。就好比,我们每个人总会右一下外号,或者是小名。当朋友或者家长不管是直接叫你的名字,还是叫你的小名,你都会答应…...

【自学安全防御】三、企业双机热备和带宽管理的综合实验

实验拓扑: 实验任务: 12,对现有网络进行改造升级,将当个防火墙组网改成双机热备的组网形式,做负载分担模式,游客区和DMZ区走FW3,生产区和办公区的流量走FW1 13,办公区上网用户限制流…...

无极与有极电容的区别

无极性电容与有极性电容:差异与应用探索 在电子元件的广阔世界里,电容器无疑是不可或缺的一部分。它们以储存电荷和调节电路中的电压与电流而闻名。然而,电容器并非一概而论,其中最为显著的区别之一就是无极性电容与有极性电容。…...

入坑树莓派(2)——树莓派4B与手机蓝牙通信

入坑树莓派(2)——树莓派4B与手机蓝牙通信 1、引言 在入坑树莓派(1)中已经搞掂了可视化问题。现在继续开展下一步,尝试与手机通信,一开始是想弄wifi连接的,但发现基于wifi的APP比较难弄,为了降低开发的难度,又因为树莓派板子自带蓝牙模块,所以直接选用蓝牙连接手机…...

RocketMQ单结点安装/Dashboard安装

目录 1.安装NameServer 2.安装Broker 3.使用自带工具测试数据发送 4.使用DashBoard进行查看 5.关闭相关设备 前置条件:两台虚拟机CentOS Linux release 7.5.1804(ps:当然也可以都部署在一台机器上) RocketMq属于天生集群。需要同时启动nameServer和Broker进行…...

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第二篇 Linux系统编程篇-第三十四章 进程基础

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…...

使用LVS+NGinx+Netty实现数据接入

数据接入 链接参考文档 LVSKeepalived项目 车辆数据上收,TBox通过TCP协议连接到TSP平台 建立连接后进行数据上传。也可借由该连接实现远程控制等操作。 通过搭建 LV—NGinx—Netty实现高并发数据接入 LVS:四层负载均衡(位于内核层&#x…...

云手机结合自主ADB命令接口 提升海外营销效率

现在,跨境电商直播已经成为在线零售的重要渠道,在大环境下,确保直播应用的稳定性和用户体验至关重要。 云手机支持自主ADB命令接口,为电商直播营销提供了技术支持,使得应用开发、测试、优化和运维更加高效。 什么是A…...

【计算机视觉前沿研究 热点 顶会】CVPR 2024中与域适应、分布外目标检测相关的论文

测试时间线性分布外检测 分布外( OOD)检测旨在通过在输入样本显著偏离训练分布(分布中)时触发警报来解决神经网络的过度置信度预测,这表明输出可能不可靠。当前的 OOD 检测方法探索各种线索来识别 OOD 数据&#xff0…...

首次由国产8K摄像机服务巴黎奥运会8K公用信号

法国巴黎时间16日上午,中央广播电视总台“中国红”8K转播车穿越大半个地球,抵达法兰西体育场,顺利完成与奥林匹克转播公司(OBS)的交接。 (1)“中国红”8K转播车 作为适合户外露天项目的“移动制作域”,“…...

idea怎么配置gradle多个版本

1.背景 gradle版本很多,而且很多时候版本是不兼容的,我们希望拉取下来的代码就包含已经配置好的版本,而不是去配置本机的gradle版本..... 意思就是要实现项目A可以用6.X版本 项目B可以使用7.X版本 项目C可以用9.X版本..... 2.配置方式 步骤一:项目根路径下保留一个文件夹…...

SpringCloudAlibaba-Seata2.0.0与Nacos2.2.1

一、下载 ## 下载seata wget https://github.com/apache/incubator-seata/releases/download/v2.0.0/seata-server-2.0.0.tar.gz## 解压 tar zxvf seata-server-2.0.0.tar.gz二、执行sql文件 ## 取出sql文件执行 cd /seata/script/server/db/mysql ## 找个mysql数据库执行三、…...

【编程语言】C++和C的异同点

文章目录 相同点不同点cin和scanf()结构体struct指针:NULL、nullptr、void* 有一段时间没有发博客了,从笔记里摘录一些发两篇。 相同点 C有很多从C继承过来的东西,因此C书(《C Primer》、《C Primer Plus》)中有一些基础的东西讲的并没有C书…...

【日常记录】【插件】excel.js导出的时候给单元格设置下拉选择、数据校验等

文章目录 1. 代码基本结构2. 导出的excel 某单元格的值设置为下拉选择3. 如何把下拉选择项设置为动态4. 单元格设置校验、提示5. 在WPS上的设置 1. 代码基本结构 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><…...

分布式 I/O 系统Modbus TCP 耦合器BL200

BL200 耦合器是一个数据采集和控制系统&#xff0c;基于强大的 32 位微处理器设计&#xff0c;采用 Linux 操作系统&#xff0c;可以快速接入现场 PLC、SCADA 以及 ERP 系统&#xff0c; 内置逻辑控制、边缘计算应用&#xff0c;支持标准 Modbus TCP 服务器通讯&#xff0c;以太…...

人工智能导论-机器学习

机器学习概述 概述 本章主要介绍的机器学习的概念、发展历程、发展趋势、相关应用&#xff0c;着重拓展机监督学习和无监督学习的相关知识。 重点&#xff1a;机器学习的定义和应用&#xff1b; 难点&#xff1a;机器学习算法及分类。 机器学习 - 重要性 MachineLeaning出…...

计算机网络——网络层(路由选择协议、路由器工作原理、IP多播、虚拟专用网和网络地址转换)

目录 路由选择协议 因特网的路由选择协议特点 路由信息协议RIP RIP衡量目的网络距离 RIP选择路由器的方式 RIP具有以下三个重要特点 RIP的基本工作流程 RIP的距离向量算法 ​编辑 ​编辑 RIP存在的问题——“坏消息传播得慢” RIP的封装 开放最短路径优先协议OSPF…...

对接企业微信API自建应用配置企业可信IP

前言 为了实现系统调用团队会议功能&#xff0c;组织发起企业微信会议&#xff0c;于是需要和企业微信做API对接。对接过程很难受&#xff0c;文档不清晰、没有SDK、没有技术支持甚至文档报文和实际接口报文都不匹配&#xff0c;只能说企业微信的API是从业以来见过的最难用的AP…...

Windows右键新建Markdown文件类型配置 | Typora | VSCode

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 今天毛毛张分享的是如何在右键的新建菜单中添加新建MarkdownFile文件&#xff0c;这是毛毛张分享的关于Typora软件的相关知识的第三期 文章目录 1.前言&#x1f3dd;…...

PyTorch构建一个肺部CT图像分类模型来分辨肺癌

当你有5万个标注的肺部CT DICOM图像数据&#xff0c;并且希望使用PyTorch构建一个肺部CT图像分类模型来分辨肺癌&#xff0c;以下是详细的步骤和示例代码&#xff1a; 数据准备 首先&#xff0c;确保你的数据集被正确分为训练集、验证集和测试集&#xff0c;并且每个图像都有相…...

MySQL简介及数据库

mysql简介 mysql是一个轻量级关系型数据库管理系统&#xff0c;具有体积小&#xff0c;速度快&#xff0c;开源的优点 sql是一种结构化查询语言(Structured Query Language)&#xff0c;专门用来管理和处理关系型数据库的标准化编程语言&#xff0c;mysql实现了SQL标准&#xf…...

服务器基础1

服务器基础复习01 1.环境部署 系统&#xff1a;华为欧拉系统 网络简单配置nmtui 因为华为欧拉系统密码需要复杂度 所以我们可以进入后更改密码 echo 123 | passwd --stdin root也可以 echo "root:123" | chpasswd2.关闭防火墙&#xff0c;禁用SElinux 首先先关…...

<数据集>光伏板缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2400张 标注数量(xml文件个数)&#xff1a;2400 标注数量(txt文件个数)&#xff1a;2400 标注类别数&#xff1a;4 标注类别名称&#xff1a;[Crack,Grid,Spot] 序号类别名称图片数框数1Crack8688922Grid8248843S…...

leetcode 513. 找树左下角的值

给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7提示: 二叉树的节点个数的范围是 [1,104]-231 < Node.val &…...

C++并发编程实战学习笔记

一、C的并发&#xff1a; 多进程并发&#xff1a; 将应用程序分为多个独立的进程&#xff0c;它们在同一时刻运行&#xff0c;就像同 时进行网页浏览和文字处理一样。独立的进程可以通过进程间常规的通信渠道传递讯息(信号、套接字、文件、管道等等)。不过&#xff0c;这种进程…...

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【25】【分布式事务】

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【25】【分布式事务】 本地事务事务的基本性质事务的隔离级别&#xff08;下面四个越往下&#xff0c;隔离级 别越高&#xff0c;并发能力越差&#xff09;事务的传播行为&#xff08;是否…...

HC05主从一体蓝牙模块的裸机使用——单片机<-->蓝牙模块

HC-05是一种常用的蓝牙模块&#xff0c;具有低功耗、低成本、易于使用的特点。它可以实现与其他蓝牙设备&#xff08;如手机、电脑等&#xff09;进行无线通信。HC-05蓝牙模块具有串口通信接口&#xff0c;可以通过串口与主控制器&#xff08;如Arduino、Raspberry Pi等&#x…...

“点点通“餐饮点餐小程序-计算机毕业设计源码11264

"点点通"餐饮点餐小程序 XXX专业XX级XX班&#xff1a;XXX 指导教师&#xff1a;XXX 摘要 随着中国经济的飞速增长&#xff0c;消费者的智能化水平不断提高&#xff0c;许多智能手机和相关的软件正在得到更多的关注和支持。其中&#xff0c;微信的餐饮点餐小程序更…...

C#知识|账号管理系统-账号信息管理界面[1]:账号分类选择框、Panel面板设置

哈喽,你好啊,我是雷工! 前一节实现了多条件查询后端代码的编写, 接下来继续学习账号信息管理界面的功能编写,本节主要记录账号分类选择框和Panel的设置, 以下为学习笔记。 01 功能说明 本节实现以下功能: ①:账号分类选择框只能选择,无法自由输入; ②:账号分类框默认…...

Meta即将推出4000亿的Llama 3 超级AI模型,或将改写大语言模型竞争格局!|TodayAI

2024年4月&#xff0c;科技巨头Meta发布了其最新的AI大型语言模型——Llama 3&#xff0c;该模型基于一个至少比前代产品Llama 2大七倍的数据集&#xff0c;展现出前所未有的性能。在最初发布时&#xff0c;Llama 3提供了8B和70B两种参数规模的版本&#xff0c;并迅速超越了Goo…...

wordpress 载入特别慢/竞价推广出价多少合适

英特尔第四代CPU架构(Haswell)&#xff1a;Haswell的最高端核芯显卡GT3系列在移动版Core i7使用&#xff0c;而中端的GT2则分配给桌面版的Core i系列处理器&#xff0c;而最低端的奔腾、赛扬搭载GT1。此外&#xff0c;Haswell将会使用LGA1150插座&#xff0c;无法和LGA1155替换…...

如何编辑做网站/西安优化seo托管

我必须创建字体为Times New Roman、字体大小为16的内容。如何使用python脚本创建&#xff1f; 我的示例脚本import xlwt workbook xlwt.Workbook(encoding ascii) worksheet workbook.add_sheet(My Worksheet) font xlwt.Font() # Create the Font font.name Times New Ro…...

阿里网站制作需要多少钱/谷歌竞价推广教程

单击服务和应用程序&#xff0c;右边的配置服务或应用程序选择分配给文件服务器的存储磁盘&#xff0c;GDNS自动生成A记录查看修改后台打印文件夹修改打印机服务器属性返回故障转移集群查看状态正常如下图主节点为PRT-02手动切换主节点部署集群打印机此处按正常打印机部署设置&…...

网站设置二级域名好吗/网络黄页推广软件哪个好

一、 文章概述 互联网时代&#xff0c;网络上的数据量每天都在以惊人的速度增长。同时&#xff0c;各类网络安全问题层出不穷。在信息安全重要性日益凸显的今天&#xff0c;作为一名开发者&#xff0c;需要加强对安全的认识&#xff0c;并通过技术手段增强服务的安全性。crypto…...

诗敏家具网站是谁做的/seo是干嘛的

Jenkins1.190.0升级到Jenkins2.303.2 jenkinsci/blueocean镜像是优化界面化的一个版本 目前镜像版本: jenkinsci/blueocean:1.19.0,对应的jenkins版本为:1.190.2 升级后的版本: jenkinsci/blueocean:1.24.3,对应的jenkins版本为:2.263.2 注:如果不是这个版本的镜像不…...

自助建站竹子/百度推广在线客服

关联关系 一对一 A中包含B的对象&#xff0c;B中包含A的对象 一对多 A中包含B的集合&#xff0c;B中包含A的对象 多对多 A中包含B的集合&#xff0c;B中包含A的集合 1,一对多配置 一名老师可以对应多名学生 2,模型类 老师类中包含学生的集合(通常可以将集合直接进行初始化) 学生…...