【C++知识扫盲】------C++ 中的引用入门
在 C++ 中,引用(reference) 是一个非常重要的概念,它提供了一种别名机制,让我们可以给已经存在的变量起一个新的名字,并且能够通过这个别名直接操作原始变量。本文将详细介绍引用的定义、使用场景及其与指针的区别。
1. 引用的基础概念
引用本质上是某个变量的别名。任何对引用的操作,都会影响它所指向的变量。引用在声明时通过 & 符号定义:
int a = 10; // 定义一个整型变量 a
int &ref = a; // 定义引用 ref,ref 是 a 的别名
在上面的代码中,ref 是 a 的引用。此后,无论通过 a 还是 ref,对这个变量的操作都指向同一个内存地址。
- 修改 ref 就相当于修改 a。
- 读取 ref 的值,相当于读取 a 的值。
2. 引用与指针的区别
虽然引用和指针都能指向一个变量,但它们之间有一些显著区别:
- 引用必须在声明时初始化,而指针可以在声明后赋值。
int &ref; // 错误:引用必须在声明时初始化
int *ptr; // 正确:指针可以不初始化
- 引用一旦绑定,就不能再指向其他变量,而指针可以修改指向的对象
int a = 10;
int b = 20;
int &ref = a; // ref 是 a 的引用
ref = b; // 这里是将 b 的值赋给 a,而不是改变引用
指针则可以改变其指向:
int *ptr = &a;
ptr = &b; // 现在 ptr 指向 b
引用在使用时不需要解引用,而指针需要使用 * 来访问指针指向的值。
ref = 20; // 直接使用 ref 修改 a
*ptr = 20; // 需要解引用指针修改 a
3. 常量引用
C++ 支持常量引用,表示引用不能用于修改所指向的变量。常量引用声明时在类型前加上 const 关键字:
const int &ref = a;
常量引用常用于函数参数传递,保证传入的对象不会被修改,同时避免拷贝。
4. 引用作为函数参数
通过引用传递函数参数能够避免数据拷贝,提高效率,特别是当传递大型对象时。函数可以直接操作传入的变量。
4.1 通过引用传递参数
void swap(int &x, int &y)
{int temp = x;x = y;y = temp;
}int main()
{int a = 5, b = 10;swap(a, b); // 交换 a 和 b 的值
}
在这个例子中,swap 函数使用引用交换两个变量的值,而无需创建副本。
4.2 常量引用作为函数参数
常量引用可以用于保护传入参数不被修改,同时避免拷贝大对象,提高性能。
void print(const std::string &str)
{std::cout << str << std::endl;
}
在此例中,print 函数通过常量引用避免拷贝 std::string,但同时保证字符串不会被修改。
5. 引用作为函数返回值
引用可以作为函数的返回值,允许函数返回原始数据而不是副本。通过返回引用,函数可以直接操作调用者的变量。
int& getMax(int &x, int &y) {return (x > y) ? x : y;
}int main() {int a = 5, b = 10;getMax(a, b) = 20; // 修改返回的较大值
}
在此例中,getMax 函数返回两个参数中较大值的引用,允许我们修改这个值。
注意:不要返回局部变量的引用,因为局部变量在函数返回后被销毁,引用将指向无效内存,导致未定义行为。
int& badFunction() {int a = 10;return a; // 错误:返回局部变量的引用
}
7. 常见应用场景
- 通过引用传递参数:避免拷贝,尤其适用于大型对象(如 std::vector 和 std::string)。
- 返回引用:允许函数直接修改调用者的变量。
- 常量引用:保护变量不被修改,避免不必要的拷贝。
相关文章:
【C++知识扫盲】------C++ 中的引用入门
在 C 中,引用(reference) 是一个非常重要的概念,它提供了一种别名机制,让我们可以给已经存在的变量起一个新的名字,并且能够通过这个别名直接操作原始变量。本文将详细介绍引用的定义、使用场景及其与指针的…...
【机器学习】6 ——最大熵模型
机器学习6——最大熵模型 目录 机器学习6——最大熵模型最大熵(maximum entropy)模型模型模型学习(估计参数)模型评价应用 最大熵(maximum entropy)模型 选择熵最大的概率模型 熵是衡量不确定性的…...
小程序——生命周期
文章目录 运行机制更新机制生命周期介绍应用级别生命周期页面级别生命周期组件生命周期生命周期两个细节补充说明总结 运行机制 用一张图简要概述一下小程序的运行机制 冷启动与热启动: 小程序启动可以分为两种情况,一种是冷启动,一种是热…...
基于微信小程序的宠物之家的设计与实现
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的宠物之家/宠物综合…...
自定义EPICS在LabVIEW中的测试
继续上一篇:LabVIEW中EPICS客户端/服务端的测试 变量定义 You can use CaLabSoftIOC.vi to create new EPICS variables and start them. CA Lab - LabVIEW (Realtime) EPICS INPUT: PV set Cluster-array of names, data types and field definitions to crea…...
基于深度学习的农作物病害检测
基于深度学习的农作物病害检测利用卷积神经网络(CNN)、生成对抗网络(GAN)、Transformer等深度学习技术,自动识别和分类农作物的病害,帮助农业工作者提高作物管理效率、减少损失。 1. 农作物病害检测的挑战…...
【C#】命名规范
文章目录 C# 命名规范使用Pascal case使用Camel case方法、属性、类命名见名知义LINQ查询变量使用有意义的名称如何声明成员变量和字段正确格式化和缩进代码如何撰写备注 通用C#编码最佳实践如何将值与空字符串进行比较使用异常处理使用&&和||可获得更好的性能单一职责…...
超级帐本(Hyperledger)
1. Hyperledger 项目 Hyperledger 下有两类项目:第一类是区块链框架项目;第二类是支持这些区块链的相关工具或模块。 在 Hyperledger 框架下,目前有 5 个区块链框架项目:Fabric、Sawtooth Lake、Iroha、Burrow 和 Indy。 在模块类下,则有 Hyp…...
如何精细优化网站关键词排名:实战经验分享
在数字营销日益激烈的今天,我深知每一个关键词的排名都关乎着网站的流量与转化。凭借多年的实战经验,我深刻体会到,要想在浩如烟海的网络世界中脱颖而出,精细化的关键词优化策略至关重要。今天,我将从实战角度出发&…...
Ruoyi Cloud 本地启动
本文视频版本:https://www.bilibili.com/video/BV1SNtueBE9M 参考 http://doc.ruoyi.vip/ https://gitee.com/y_project/RuoYi-Cloud https://blog.csdn.net/cs_dnzk/article/details/135289966 https://doc.ruoyi.vip/ruoyi-cloud/cloud/seata.html#%E5%9F%BA%E6…...
Nginx解析:入门笔记
🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨欢迎加入探索nginx之旅✨ 👋 大家好!文本学习和探索Nginx配置。…...
在 Mac 上安装双系统会影响性能吗,安装双系统会清除数据吗?
在 Mac 系统安装并使用双系统已经成为了许多用户办公的选择之一,双系统可以让用户在 Mac 上同时运行 Windows 或其他操作系统。然而,许多用户担心这样做会对 Mac 的性能产生影响。 接下来将给大家介绍 Mac 装双系统会影响性能吗,Mac装双系统…...
vue3提交按钮限制重复点击
下载lodash npm install lodash 引入并使用 <template><div click"submit()">提交</div> </template><script setup>import { debounce } from lodash;const submit debounce(() > {//业务代码},2000,{leading: true,trailing:…...
Java | Leetcode Java题解之第395题至少有K个重复字符的最长子串
题目: 题解: class Solution {public int longestSubstring(String s, int k) {int ret 0;int n s.length();for (int t 1; t < 26; t) {int l 0, r 0;int[] cnt new int[26];int tot 0;int less 0;while (r < n) {cnt[s.charAt(r) - a];…...
20240915 每日AI必读资讯
国家网信办发布《人工智能生成合成内容标识办法(征求意见稿)》 - 要求所有的AI生成内容都要打标,包括文字、图像、视频、音频… - 文本内容要插入标识符提醒,音频内容要在里面插入提示音 - 对创作者不太友好,对平台…...
量化交易需要注意的关于股票交易挂单排队规则的问题
炒股自动化:申请官方API接口,散户也可以 python炒股自动化(0),申请券商API接口 python炒股自动化(1),量化交易接口区别 Python炒股自动化(2):获取…...
应急响应实战---是谁修改了我的密码?
前言:此次应急响应为真实案例,客户反馈无法通过密码登录服务器,疑似服务器被入侵 0x01 如何找回密码? 客户服务器为windows server2019,运维平台为PVE平台;实际上无论是windows系统或者是linux系统&#…...
知识的通用性
概述 很久没有写文章了,因为集团公司当前在大刀阔斧的改革,人员精简,很多事情都合并到同一个人身上,同时将内部的沟通软件平台又做一次大的切换,很多资料都需要重新的整理。 所以,抱歉,很多内…...
36岁,大厂女程序员,中年失业后,我开始接受自己的平凡,并深耕自己
作为80后秦岭大山里面的穷苦农民工家的孩子,从小因为讨厌做家务,做农活,而且家里孩子众多,物质匮乏,从小就特别渴望走出大山。 上学的时候,通过刻苦努力,成绩也还算可以,经常受到老师…...
shader 案例学习笔记之mix函数
mix函数: 在两个值之间进行插值; 使用: #ifdef GL_ES precision mediump float; #endifuniform vec2 u_resolution; uniform float u_time;vec3 colorA vec3(0.149,0.141,0.912); vec3 colorB vec3(1.0,0.83,0.224);void main(){vec2 st…...
JASP统计分析软件:开源数据分析的技术实践指南
JASP统计分析软件:开源数据分析的技术实践指南 【免费下载链接】jasp-desktop JASP aims to be a complete statistical package for both Bayesian and Frequentist statistical methods, that is easy to use and familiar to users of SPSS 项目地址: https://…...
痕迹的痕迹:从朱君鸿论牟宗三与林安梧看学术争论的自感根源
痕迹的痕迹:从朱君鸿论牟宗三与林安梧看学术争论的自感根源 岐金兰 --- 摘要 朱君鸿的文章《从“横摄系统”到“横摄归纵”》是对牟宗三与林安梧不同朱子观的比较研究。从AI元人文的视角看,这篇文章本身是一层“痕迹”——它是对牟宗三、林安梧痕迹的再痕…...
VBA延时技术全解析:从基础Timer到高精度API的避坑指南
1. VBA延时技术入门:为什么需要精确控制时间? 在自动化办公场景中,VBA脚本经常需要控制操作节奏。比如批量处理Excel数据时,如果连续快速操作可能导致系统资源冲突;或者开发用户界面时需要实现按钮点击后的缓冲效果。这…...
Biome 代码检查:别再等 ESLint 慢吞吞了
Biome 代码检查:别再等 ESLint 慢吞吞了 毒舌时刻这代码写得跟网红滤镜似的——仅供参考。各位前端同行,咱们今天聊聊 Biome。别告诉我你还在用 ESLint Prettier,那感觉就像用老爷车跑高速——能跑,但慢得让人崩溃。 为什么你需要…...
红枣切片机的设计【说明书+CAD图纸+solidworks三维+开题报告+答辩PPT】
红枣切片机的设计聚焦于提升切片效率与切片质量,其核心作用在于通过机械结构优化与传动系统设计,实现红枣的自动化、标准化切片加工。设备采用旋转刀盘与固定进料轨道的协同工作模式,刀盘以均匀转速旋转,红枣在重力与轨道约束下依…...
DASD-4B-Thinking部署教程:Docker镜像内vLLM服务健康检查脚本编写与自动重启
DASD-4B-Thinking部署教程:Docker镜像内vLLM服务健康检查脚本编写与自动重启 1. 项目背景与需求 DASD-4B-Thinking是一个专门针对数学、代码生成和科学推理任务优化的40亿参数语言模型。它通过vLLM框架部署,配合chainlit前端提供交互式体验。但在实际使…...
3分钟掌握MicroPython WebREPL:浏览器直接控制嵌入式设备
3分钟掌握MicroPython WebREPL:浏览器直接控制嵌入式设备 【免费下载链接】webrepl WebREPL client and related tools for MicroPython 项目地址: https://gitcode.com/gh_mirrors/we/webrepl 想要用浏览器直接控制你的MicroPython开发板吗?WebR…...
Tina Linux 适配 RTL8733bs WIFI 模块:从设备树到网络连接全流程解析
1. 硬件接口配置与设备树修改 第一次接触RTL8733bs这个Wi-Fi/蓝牙二合一模块时,我花了两天时间才搞明白硬件连接和设备树配置的关系。这个模块通过SDIO接口与全志V853主控通信,蓝牙部分则使用UART接口。下面我就把踩过的坑和验证过的正确配置分享给大家。…...
零代码实现YouTube视频翻译:Hugging Face大语言模型实战教程
零代码实现YouTube视频翻译:Hugging Face大语言模型实战教程 在全球化内容消费的今天,语言障碍成为许多人获取知识的隐形门槛。想象一下,当你发现一个精彩的英文技术讲座视频,却因为语言问题无法充分理解;或是需要将中…...
自媒体人的秘密武器:OpenClaw+Qwen3-32B-Chat全平台内容分发
自媒体人的秘密武器:OpenClawQwen3-32B-Chat全平台内容分发 1. 为什么我需要一个自动化内容分发助手 去年夏天,我同时运营着公众号、微博和短视频三个平台。每次创作完核心内容后,总要花大量时间做格式转换:把长文章拆成微博线程…...
