C++的“引用”是条寄生虫
在C++中,引用(reference)是一个已存在变量的别名(alias)。比如鲁讯原名周树人,前者就是后者的别名。
一、引用的用法
定义引用时需要用到&,用法如下:
int ival = 9527;
int &refVal = ival; // refVal指代ival,是ival的另一个名字
二、引用的注意事项
引用是对象的第二个名字,像个寄生虫一样寄生在原名之上,因此定义时必须要与原名(某个已存在的变量)绑定,下面的定义是错误的:
int &refVal; // 错误:引用在定义时必须要初始化
寄生虫有个特点,离开宿主就会完蛋。求生的欲望把引用打造成一个特别忠贞的孩子:一旦绑定,终身不改,再也不能换对象。从这个特性可以推断出,引用内部的实现应该是一个常量指针。
前面的int &refVal = ival;用C语言表示相当于:
const int *refVal = &ival;
三、引用的主要用途
在功能上,引用和指针(pointer)比较相像,主要用于函数参数传递。普通的变量是以“传值”的方式传递参数,需要将实参的值复制给形参,在函数中改变的是形参,而不是赋值给形参的实参。这就像我盖了一个和我的房子一模一样房子送给你,这个工程量是很大的,而且你装修是你的房子。
指针以“传址”的方式传递参数,传过去的是地址,在函数中是能改变实参的。这就像我把我房子的地址告诉你,你按地址找到我家,装修的是我的房子。
引用是以“传名”的方式传递参数,传过去的是变量的名字,在函数中也是能改变实参的。这就像我把我的房子的名字告诉你,你一样能找到我的房子。
引用在内部实现上也是用了指针的,但是用引用会更方便(语法层面,引用不需要用&获取地址,也不需用*访问数据)。就像你打车去找福尔摩斯,如果说去贝克街221号,司机可能要反应一会儿,但如果直接说去福尔摩斯家,它可能立马反应出他家的位置(但不一定知道是贝克街221号)。
用最经典的“交换两个变量”来验证三种传递参数方式的区别:
#include<iostream>
using namespace std;//普通变量:传值版
void swap1(int a, int b){int t=a;a=b;b=t;
}//指针:传址版
void swap2(int *a, int *b){int t=*a;*a=*b;*b=t;
}//引用:传名版
void swap3(int &a, int &b){int t=a;a=b;b=t;
}int main(){//普通变量:传值版int a=3, b=9;swap1(a, b);printf("%d %d\n", a, b);//指针:传址版a=3, b=9;swap2(&a, &b);printf("%d %d\n", a, b);//引用:传名版a=3, b=9;swap3(a, b);printf("%d %d\n", a, b);return 0;
}
输出结果:

显而易见,引用能用实现指针的功能,但用起来比指针方便得多。
四、引用与指针的区别
引用的寄生性决定了与指针的区别
①引用在声明时必须初始化,而指针不必。
②引用一旦初始化,就不能再指向其他对象,而指针可以随时改变它所指向的对象。
③不存在空引用,但存在空指针。
④引用一旦初始化,就可以像普通变量一样使用,不需要使操作符*访问数据,指针在访问所指向的对象时需要使用操作符*。
相关文章:
C++的“引用”是条寄生虫
在C中,引用(reference)是一个已存在变量的别名(alias)。比如鲁讯原名周树人,前者就是后者的别名。 一、引用的用法 定义引用时需要用到&,用法如下: int ival 9527; int &am…...
人体感应提醒 大声公+微波模块
文章目录 模块简介接线程序示例 模块简介 微波感应开关模块 RCWL-0516是一款采用多普勒雷达技术,专门检测物体移动的微波感应模块。采用 2.7G 微波信号检测,该模块具有灵敏度高,感应距离远,可靠性强,感应角度大&#…...
正确的功能可将热晶体管风速计线性化
处理传感器电路输出信号的电路或计算公式必须生成传感器响应的反函数。例如,如果传感器响应是对数函数,则线性化部分的响应必须是指数的。 这项工作首先获取传感器响应的 46 个离散点(参见参考论文中的图 4)。刚开始时࿰…...
小程序集arcgis地图显示自定义坐标的功能实现记录!(学习笔记)
最近再做一个新能源回收项目,项目中有个根据回收点坐标数据显示区域内回收点位置,点击图标直接导航到该位置,及分布的需求,研究了一下,实现效果如下,实现起来很简单,代码及效果 回收点位置及分…...
谷歌医疗大模型登Nature,Med-PaLM重磅揭秘!AI医生成绩比肩人类
5月I/O大会上,Med-PaLM 2重磅升级,甚至达到了专家水准。 今天,谷歌揭秘微调后的Med-PaLM,同样在医学问题上一骑绝尘。 研究成果已登Nature。 论文地址:https://www.nature.com/articles/s41586-023-06291-2 这项研究…...
java-字符串相关类的底层原理
在 Java 中,字符串处理是编程中的一个常见任务。Java 提供了多种字符串相关的类,如 String, StringBuilder, StringBuffer 和 CharSequence 等,以满足不同的需求。这些类的底层原理基于 Java 内部的数据结构和算法。在本教程中,我…...
C++模板编程—学习C++类库的编程基础
课程总目录 文章目录 一、详解函数模板二、类模板三、类模板实践:实现向量容器vector四、理解容器空间配置器allocator的重要性 一、详解函数模板 模板的意义:对类型也可以进行参数化了 // 也可以用template<class T>,但class容易和类…...
[每周一更]-(第99期):MySQL的索引为什么用B+树?
文章目录 B树与B树的基本概念B树(Balanced Tree)B树(B-Plus Tree)对比 为什么MySQL选择B树1. **磁盘I/O效率**2. **更稳定的查询性能**3. **更高的空间利用率**4. **并发控制** 其他树结构的比较参考 索引是一种 数据结构&#x…...
详解MySQL的MVCC机制
多版本并发控制(MVCC,Multi-Version Concurrency Control)是MySQL InnoDB存储引擎用于实现事务隔离和提高并发性能的一种机制。MVCC通过在同一数据的多个版本之间进行管理,允许读写操作并发进行,从而避免了传统锁机制带…...
docker部署skywalking
skywalking版本下载 1:拉取skywalking的oap镜像(可以选择自己的版本,最好与ui,agent版本一致) docker pull apache/skywalking-oap-server:9.5.02:启动oap docker run -d -p 11800:11800 -p 12800:12800 --name sw_oap apache/…...
Mac 使用Docker安装Elasticsearch、Kibana 、ik分词器、head
安装ElasticSearch 通过docker安装es docker pull elasticsearch:7.8.1 在本地创建elasticsearch.yml文件 mkdir /Users/ky/Documents/learn/es/elasticsearch.yml 编辑yml文件内容 http: host: 0.0.0.0 xpack.security.enabled: false xpack.security.enrollment.enabled: t…...
【Webpack4打包机制原理解析】
webpack是一个打包模块化 JavaScript 的工具,在 webpack里一切文件皆模块,通过 Loader 转换文件,通过 Plugin 注入钩子,最后输出由多个模块组合成的文件。webpack专注于构建模块化项目。 # 简单版打包模型步骤 我们先从简单的入手…...
如何提高接口响应速度
在非大数据(几万以上记录)的情况下,影响接口响应速度的因素中最大的是查询数据库的次数,其次才是数组遍历和简单数据处理(如根据已有字段增加新的属性,或计算值)。 一般一次数据库查询需要50毫秒…...
项目敏感配置信息加固
概述 引入jasypt做密码等敏感配置信息的加固 项目集成依赖 pom.xml引入jasypt-spring-boot-starter依赖 <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.…...
HCIA-AI课程大纲
该阶段详细介绍各个机器学习范式方法,涵盖有监督、无监督、半监督、强化学习,以及深度学习算法基础,共计 72 课时。 第一节:华为云 ModelArts 云服务开发环境搭建 - (2 课时) - 华为云 ModelArts 云服务简…...
keil program algorithm 出错
前段时间 在 调试下载算法时,遇到一个奇怪的问题 就是 加载下载算法后, 下载算法的RAM空间 大小不能修改为 单片机的最大RAM,只能改到最大4KB的空间大小, 再大就报错 刚开始报错 一直不知道原因,走了很多弯路, 到最…...
SITNE24V2BNQ-3/TR一种瞬态电压抑制器,对标PESD1CAN
SITNE24V2BNQ是一种瞬态电压抑制器,设计用于保护两个汽车控制器区域 网络(CAN)母线不受ESD等瞬变造成的损坏。 SITNE24V2BNQ采用SOT-23封装。标准产品不含铅和卤素。 产品参数 方向:双向通道数:2VRWM(V)(Max):24IPP8/20μS(A)(M…...
Vue3【四】使用Vue2的写法写一个新的组件子组件和根组件
Vue3【四】使用Vue2的写法写一个新的组件 Vue3【四】使用Vue2的写法写一个新的组件 Vue3是向下兼容的,所有可以使用Vue的选项式写法 运行截图 目录结构 文件源码 App.vue <template><div class"app"><h1>你好世界! 我是App根组件<…...
指标体系建设10大坑
在企业经营和运营管理中,指标体系的建设至关重要,它在一定程度上是反映业务的问题状况,影响决策者的决策。但是,在指标体系的建设过程中,常常会存在一些不容忽视的“坑”,今天做个总结,以下为个…...
ubuntu 20.04上docker 使用gpu
要在Docker容器中使用GPU,你需要确保系统上已经安装了正确的NVIDIA驱动程序,并且安装了NVIDIA Container Toolkit。以下是详细的步骤: 1. 安装NVIDIA驱动程序 确保你的系统上已经安装了适当版本的NVIDIA驱动程序。你可以通过运行以下命令来检查驱动程序是否正确安装: nv…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
