C++值传递和引用传递
系列文章目录
值传递和引用传递是 C++ 中两种常见的参数传递方式,它们的主要区别在于函数内部对参数的操作是否会影响原始数据
C++值传递和引用传递
- 系列文章目录
- 1、值传递
- 2、引用传递
- 3 、常量引用传递
- 4、值传递 vs 引用传递
- 总结
1、值传递
值传递会复制传入的参数,函数内部对参数的修改不会影响原始数据
#include <iostream>
#include <vector>
using namespace std;void modify(int a){a = 100; // 修改副本的值cout << "modify函数中: a = " << a << endl;
}int main() {int a=10;cout<< "原始变量a的值为:" <<a <<endl;modify(a);cout<< "调用函数之a的值为:" <<a <<endl;return 0;
}
输出:
原始变量a的值为:10
modify函数中: a = 100
调用函数之a的值为:10
解释:
在 modifyValue 函数中,x 是 a 的副本。
修改 x 不会影响原始变量 a。
2、引用传递
引用传递会直接操作原始数据,函数内部对参数的修改会影响原始数据
#include <iostream>
#include <vector>
using namespace std;void modify(int &a){a = 100; // 修改副本的值cout << "modify函数中: a = " << a << endl;
}int main() {int a=10;cout<< "原始变量a的值为:" <<a <<endl;modify(a);cout<< "调用函数之a的值为:" <<a <<endl;return 0;
}
这里修改的地方只是在modify函数中加了一个&
输出结果:
原始变量a的值为:10
modify函数中: a = 100
调用函数之a的值为:100
解释:
在 modifyReference 函数中,x 是 a 的引用。
修改 x 会直接影响原始变量 a。
3 、常量引用传递
如果你不想用值传递(因为会增加拷贝数据的内存开销),又不想修改原始数据,你使用这个就很合适哦。
常量引用传递既避免了值传递的拷贝开销,又防止函数内部修改原始数据
void modify(const int &a){a = 100; // 修改副本的值 这里直接会编译报错,const修饰的变量无法被修改cout << "modify函数中: a = " << a << endl;
}
const修饰的变量无法被修改。
#include <iostream>
#include <vector>
using namespace std;void modify(const int &a){// a = 100; // 修改副本的值 这里直接会编译报错,const修饰的变量无法被修改cout << "modify函数中: a = " << a << endl;
}int main() {int a=10;cout<< "原始变量a的值为:" <<a <<endl;modify(a);cout<< "调用函数之a的值为:" <<a <<endl;return 0;
}
输出如下:
原始变量a的值为:10
modify函数中: a = 10
调用函数之a的值为:10
解释:
在 printValue 函数中,x 是 a 的常量引用。
函数内部不能修改 x,但可以读取其值。
4、值传递 vs 引用传递
对于复杂数据结构(如 std::vector 或 std::string),值传递会导致整个数据被复制,而引用传递则避免了这种开销。
#include <iostream>
#include <vector>
using namespace std;// 值传递示例
void modifyVectorByValue(vector<int> vec) {vec[0] = 100; // 修改副本cout << "modifyVectorByValue function (值传递): ";for (int x : vec) {cout << x << " ";}cout << endl;
}// 引用传递示例
void modifyVectorByReference(vector<int> &vec) { // 使用引用传递vec[0] = 100; // 修改原始数据cout << "modifyVectorByReference function (引用传递): ";for (int x : vec) {cout << x << " ";}cout << endl;
}int main() {vector<int> vec = {1, 2, 3};cout << "原始数据: ";for (int x : vec) {cout << x << " ";}cout << endl;modifyVectorByValue(vec); // 值传递调用cout << "调用值传递之后: ";for (int x : vec) {cout << x << " ";}cout << endl;modifyVectorByReference(vec); // 引用传递调用cout << "调用引用传递之后: ";for (int x : vec) {cout << x << " ";}cout << endl;return 0;
}
输出如下:
原始数据: 1 2 3
modifyVectorByValue function (值传递): 100 2 3
调用值传递之后: 1 2 3
modifyVectorByReference function (引用传递): 100 2 3
调用引用传递之后: 100 2 3
总结
| 特性 | 值传递 | 引用传递 | 常量引用传递 |
|---|---|---|---|
| 是否复制数据 | 是 | 否 | 否 |
| 是否能修改原始数据 | 否 | 是 | 否 |
| 性能 | 较低(需要复制数据) | 较高(直接操作原始数据) | 较高(避免复制且不可修改) |
| 使用场景 | 数据简单且不需要修改原始数据 | 需要修改原始数据 | 只需读取数据而不修改 |
相关文章:
C++值传递和引用传递
系列文章目录 值传递和引用传递是 C 中两种常见的参数传递方式,它们的主要区别在于函数内部对参数的操作是否会影响原始数据 C值传递和引用传递 系列文章目录1、值传递2、引用传递3 、常量引用传递4、值传递 vs 引用传递总结 1、值传递 值传递会复制传入的参数&…...
LangChain4J开源开发框架简介
目录 1.1、前言1.2、集成方式简单1.3、核心功能与优势1.4、两种调用方式1.5、链式调用示例代码1.6、AI服务调用示例代码1.7、典型使用场景1.8、总结 1.1、前言 LangChain4J 是一个专为 Java 开发者设计的开源框架,旨在简化大型语言模型(LLMs)…...
Qt图形视图框架在项目中的应用
一、基本概念 Qt 的图形视图框架(Graphics View Framework)提供了一套用于显示和管理2D图形对象的框架。它提供了一组类,这些类可以组合使用来构建用户界面、处理图形对象、实现缩放、平移、旋转等操作。以下是Qt GraphicsView框架的主要组件…...
SpringBoot集成Elasticsearch 7.x spring-boot-starter-data-elasticsearch 方式
SpringBoot集成Elasticsearch 7.x | spring-boot-starter-data-elasticsearch 方式 前言添加maven依赖配置application.properties测试实体类 方式一:继承 ElasticsearchRepository(适合简单查询) 直接使用想自定义自己的Repository接口 方式…...
STM32蜂鸣器播放音乐
STM32蜂鸣器播放音乐 STM32蜂鸣器播放音乐 Do, Re, Mi, Fa, 1. 功能概述 本系统基于STM32F7系列微控制器,实现了以下功能: 通过7个按键控制蜂鸣器发声,按键对应不同的音符。每个按键对应一个音符(Do, Re, Mi, Fa, Sol, La, Si&a…...
GitLab 中文版17.10正式发布,27项重点功能解读【二】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...
解码未来:DeepSeek开源FlashMLA,推理加速核心技术,引领AI变革
前言: DeepSeek 兑现了自己的诺言,开源了一款用于 Hopper GPU 的高效型 MLA 解码核:FlashMLA。 项目地址:https://github.com/deepseek-ai/FlashMLA 1:FlashMLA 是什么呀? MLA是DeepSeek大模型的重要技术创新点&…...
leetcode:136. 只出现一次的数字(python3解法)
难度:简单 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 示例 1 …...
Isaac Sim与Isaac Lab初使用
目录 基于Omiverse下载Isaacsim安装Isaac Lab配置isaacsim环境测试克隆仓库配置python环境强化学习训练的测试 IsaacLab模板配置vscode环境ros接口安装 作为nvidia出品的仿真软件,很多机器人、机器狗【具身智能】都可以有很不错的效果,所以会使用isaac s…...
Spring AI Alibaba 工具(Function Calling)使用
一、工具(Function Calling)简介 Spring AI Alibaba工具(Function Calling):https://java2ai.com/docs/1.0.0-M6.1/tutorials/function-calling/ 1、工具(Function Calling) “工具(Tool)”或“功能调用(Function Calling…...
Touch Diver:Weart为XR和机器人遥操作专属设计的触觉反馈动捕手套
在虚拟现实(VR)和扩展现实(XR)领域,触觉反馈技术正逐渐成为提升沉浸感和交互体验的重要因素。Weart作为这一领域的创新者,凭借其TouchDIVER Pro和TouchDIVER G1触觉手套,为用户带来了高度逼真的…...
[深度学习]图片分类任务
图片分类任务 文章目录 图片分类任务分类任务回归和分类如何做分类的输出 图片分类卷积神经网络保持特征图大小不变更大的卷积核和更多的卷积核层数特征图怎么变小卷积神经网络中特征图改变卷积到全连接分类任务的LOSS一个基本的分类神经网络 经典神经网络AlexNetVggNetResNet …...
关系图:赋能数据可视化的动态扩展
关系图 关系图是一种用于展示节点之间关系和连接的图表类型。具有高度的可定制性、丰富的交互功能和动画效果,能够展示节点之间的和连接,以及随着数据的变化而呈现的动态效果。 【组件概述】 1.节点和边的可定制性: 关系图提供了丰富的配置…...
k8s存储介绍(三)valume概述与emptydir
目录 一、Kubernetes 中的 Volume 详解 基本概念 Volume 的主要类型(这里简单介绍,后续章节会详细介绍) 1. 本地存储类型 2. 网络存储类型 3. 云提供商存储 4. 特殊用途类型 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) S…...
Nodejs 项目打包部署方式
方式一:PM2 一、准备工作 确保服务器上已安装 Node.js 环境建议使用 PM2 进行进程管理(需要额外安装) 二、部署步骤 1.首先在服务器上安装 PM2(推荐): npm install -g pm22.将项目代码上传到服务器&…...
uv - Getting Started 开始使用 [官方文档翻译]
文章目录 uv亮点安装项目脚本工具Python 版本pip 接口了解更多 入门安装 uv安装方法独立安装程序PyPICargoHomebrewWinGetScoopDockerGitHub 发布 升级 uvShell 自动补全卸载 第一次使用 uv特性Python 版本脚本项目工具pip 接口实用工具 获取帮助帮助菜单查看版本故障排除问题在…...
C++类与对象的的第三个简单的实战练习-3.25笔记
哔哩哔哩C面向对象高级语言程序设计教程(118集全) 简单实战三 创建项目 打开VS,点击创建一个新项目 创建一个空项目 点击下一步 点击工程名称,选择添加 选择新建项 选择C类 取名 点击确定,这时候还需要一个main.cpp …...
CentOS安装sshpass工具-自动化SSH密码认证
sshpass是一个在Linux环境下用于自动化SSH密码认证的工具。 一、功能特点 自动化SSH登录:sshpass允许用户在命令行中直接传递密码,从而无需在SSH连接时手动输入密码。这对于自动化脚本和批处理任务非常有用,因为它可以在非交互式环境下完成…...
k8s中service概述(一)ClusterIP
ClusterIP 是 Kubernetes 中最基础且常用的 Service 类型,主要用于在集群内部提供稳定的网络访问端点。以下是关于 ClusterIP Service 的详细说明: 1. ClusterIP 的核心功能 集群内部访问:ClusterIP 提供一个集群内部的虚拟 IP(VI…...
详解接口的常见请求方式
详解接口的常见请求方式 一、 常见接口请求方式1. GET2. POST3. PUT4. DELETE5. PATCH6. HEAD7. OPTIONS 二、 实现方法1. 前端实现2. 后端实现 三、 作用与主要区别四、 举例讲解1. 创建 Spring Boot 工程2. 添加依赖3. 编写 Controller 实现接口关键点说明 4. 启动与测试5. 总…...
HarmonyOS-ArkUI Grip组件
我们在学习List的时候,已经捎带引入了Grid。讲解如下图所示: 也就是,如果一个表,长宽基本都是一致的,那么此时可以完全不用Grid也可以实现,并且,优先考虑的就是List。 如果List实现不了的情况下…...
2025清华大学:DeepSeek教程全集(PDF+视频精讲,共10份).zip
一、资料列表 第一课:Deepseek基础入门 第二课:DeepSeek赋能职场 第三课:普通人如何抓住DeepSeek红利 第四课:让科研像聊天一样简单 第五课:DeepSeek与AI幻觉 第六课:基于DeepSeek的AI音乐词曲的创造法 第…...
jupyter使用过程中遇到的问题
1、No module named ‘notebook.extensions’ 报错内容为: No module named notebook.extensions解决办法 出现这个错误代表你尝试给 Jupyter notebook 安装自动补全的插件,但是 notebook 没安装成功; 解决办法:不用 pip 安装 n…...
mac vim命令快捷键
目录 移动光标插入模式复制/粘贴删除搜索/替换退出 移动光标 快捷键说明0 / ^跳到行首,移动到光标所在行的"行首"$跳到行末,移动到光标所在行的"行尾"gg跳到文件第一行G移动到文章的最后[n]G跳到第n行w光标跳到下个字的开头e光标跳…...
【Golang】defer与recover的组合使用
在Go语言中,defer和recover是两个关键特性,通常结合使用以处理资源管理和异常恢复。以下是它们的核心应用场景及使用示例: 1. defer 的应用场景 defer用于延迟执行函数调用,确保在函数退出前执行特定操作。主要用途包括ÿ…...
低代码配置式Web组态解析
低代码配置式Web组态技术通过可视化操作和预置组件库,大幅降低开发门槛,适用于工业控制、物联网监控、数据可视化等场景。以下是综合行业实践和产品特性的分析: 一、核心功能与优势 可视化编辑与拖拽布局 提供图形化编辑器࿰…...
KiLog2MaximumIncrement的由来和KiMaximumIncrementReciprocal的由来
第一部分:KiLog2MaximumIncrement的由来 i 1; j KeMaximumIncrement; while ((1UI64<<i) < KeMaximumIncrement) { i; } KiLog2MaximumIncrement i; 2^17131072 2^18262144 i18KiLog2MaximumIncrement 中…...
基于web的家政服务网站
内容摘要 由于互联网的使用,人们在管理、应用、服务等领域使用数据更加简洁、方便,大大提高了工作效率。互联网正逐渐融入我们的生活,影响和改变我们的生活。 家政服务管理系统是典型的信息管理系统(MIS)。其开发主要…...
mac命令行快捷键
光标移动 Ctrl A: 将光标移动到行首。Ctrl E: 将光标移动到行尾。Option 左箭头: 向左移动一个单词。Option 右箭头: 向右移动一个单词。 删除和修改 Ctrl K: 删除从光标到行尾的所有内容。Ctrl U: 删除从光标到行首的所有内容。Ctrl W: 删除光标前的一个单词。Ctrl …...
聚水潭数据集成到MySQL的最佳实践分享
聚水潭数据集成到MySQL的技术案例分享 在本次技术案例中,我们将探讨如何通过轻易云数据集成平台,将聚水潭的数据高效、可靠地集成到MySQL数据库中。具体的集成方案为“聚水潭-商品信息查询-->BI初本-商品信息表_copy”。该方案旨在实现从聚水潭获取商…...
