c++中加不加const的值传递和引用传递的区别
文章目录
- 可以修改参数值的比较值传递(int x)和引用传递(int &x)
- 使用const不修改参数值的比较值传递(const int x)和引用传递(const int &x)
- 1. `const int x` 示例
- 2. `const int &x` 示例
可以修改参数值的比较值传递(int x)和引用传递(int &x)
#include <iostream>void modifyByValue(int x) {std::cout << "Inside modifyByValue:" << std::endl;std::cout << " x before modification: " << x << std::endl;x = 20; // 修改副本std::cout << " x after modification: " << x << std::endl;
}void modifyByReference(int &x) {std::cout << "Inside modifyByReference:" << std::endl;std::cout << " x before modification: " << x << std::endl;x = 20; // 修改原始变量std::cout << " x after modification: " << x << std::endl;
}int main() {int a = 10;std::cout << "Before function calls:" << std::endl;std::cout << " a: " << a << std::endl;modifyByValue(a);std::cout << "After modifyByValue:" << std::endl;std::cout << " a: " << a << std::endl;modifyByReference(a);std::cout << "After modifyByReference:" << std::endl;std::cout << " a: " << a << std::endl;return 0;
}
modifyByValue函数(值传递)
void modifyByValue(int x) {std::cout << "Inside modifyByValue:" << std::endl;std::cout << " x before modification: " << x << std::endl;x = 20; // 修改副本std::cout << " x after modification: " << x << std::endl;
}
void modifyByValue(int x):定义一个函数modifyByValue,接受一个int类型的参数x。这是值传递,x是a的副本。std::cout << "Inside modifyByValue:" << std::endl;:打印当前在modifyByValue函数内部。std::cout << " x before modification: " << x << std::endl;:打印x的值(副本),值是 10。x = 20;:修改x的值。由于x是副本,这种修改不会影响main函数中的原始变量a。std::cout << " x after modification: " << x << std::endl;:打印修改后的x的值,结果是 20。
modifyByReference函数(引用传递)
void modifyByReference(int &x) {std::cout << "Inside modifyByReference:" << std::endl;std::cout << " x before modification: " << x << std::endl;x = 20; // 修改原始变量std::cout << " x after modification: " << x << std::endl;
}
void modifyByReference(int &x):定义一个函数modifyByReference,接受一个int &类型的参数x。这是引用传递,x是对原始变量的引用。std::cout << "Inside modifyByReference:" << std::endl;:打印当前在modifyByReference函数内部。std::cout << " x before modification: " << x << std::endl;:打印x的值(引用),值是 10。x = 20;:修改x的值,由于x是对a的引用,这会直接修改a的值。std::cout << " x after modification: " << x << std::endl;:打印修改后的x的值,结果是 20。
main函数
int main() {int a = 10;std::cout << "Before function calls:" << std::endl;std::cout << " a: " << a << std::endl;modifyByValue(a);std::cout << "After modifyByValue:" << std::endl;std::cout << " a: " << a << std::endl;modifyByReference(a);std::cout << "After modifyByReference:" << std::endl;std::cout << " a: " << a << std::endl;return 0;
}
int a = 10;:定义一个整型变量a,并初始化为 10。std::cout << "Before function calls:" << std::endl;:打印在调用函数之前a的值。std::cout << " a: " << a << std::endl;:打印a的值,结果是 10。modifyByValue(a);:调用modifyByValue函数,将a的值传递给函数。函数内部的x是a的副本,对x的修改不会影响a。std::cout << "After modifyByValue:" << std::endl;:打印在调用modifyByValue函数之后a的值。std::cout << " a: " << a << std::endl;:打印a的值,结果仍然是 10,因为modifyByValue函数中的修改不影响原始变量。modifyByReference(a);:调用modifyByReference函数,将a的引用传递给函数。函数内部的x是a的引用,对x的修改直接影响a。std::cout << "After modifyByReference:" << std::endl;:打印在调用modifyByReference函数之后a的值。std::cout << " a: " << a << std::endl;:打印a的值,结果是 20,因为modifyByReference函数中的修改影响了原始变量a。
执行结果
Before function calls:a: 10
Inside modifyByValue:x before modification: 10x after modification: 20
After modifyByValue:a: 10
Inside modifyByReference:x before modification: 10x after modification: 20
After modifyByReference:a: 20
总结
- 值传递(int x):函数接收 a 的副本,对副本的修改不会影响原始变量 a。在 modifyByValue 中,a 的值保持不变。
- 引用传递(int &x):函数接收 a 的引用,对引用的修改会直接影响原始变量 a。在 modifyByReference 中,a 的值被修改为 20。
使用const不修改参数值的比较值传递(const int x)和引用传递(const int &x)
const int x 与 const int &x 的区别
在 C++ 中,const 关键字用于定义常量,意味着被修饰的变量的值不能被修改。const 可以与传值和传引用都不能改变元素值 的方式结合使用,效果有所不同。
-
const int x:x是一个常量整型参数,函数内部不能修改x的值。x是以值的方式传递的,这意味着函数内部使用的是x的副本,而不是原始变量的引用。这种方式适用于传递小的基本数据类型。 -
const int &x:x是一个常量整型的引用,函数内部不能修改x引用的值。引用传递不会复制数据,只是传递了数据的引用。通常在传递较大的对象时使用,以提高效率并避免不必要的数据复制。
1. const int x 示例
#include <iostream>void printValue(const int x) {// 打印 x 的值std::cout << "Value of x: " << x << std::endl;// 尝试修改 x 的值(这会引发编译错误)// x = 20; // 错误: 'x' 是常量,不能被修改
}int main() {int a = 10;// 调用 printValue 函数,传递整数值printValue(a);return 0;
}
-
#include <iostream>- 包含输入输出流库,用于标准输入输出操作。
-
void printValue(const int x) {- 定义了一个函数
printValue,它接受一个const int参数x。x是一个常量整型参数,函数内部不能修改它的值。
- 定义了一个函数
-
std::cout << "Value of x: " << x << std::endl;- 打印
x的值。由于x是传值的,函数内部对x的操作不会影响原始变量a的值。
- 打印
-
// x = 20;- 注释掉的代码,尝试修改
x的值会引发编译错误,因为x是const的。
- 注释掉的代码,尝试修改
-
int main() {- 主函数的开始。
-
int a = 10;- 定义一个整型变量
a,并初始化为 10。
- 定义一个整型变量
-
printValue(a);- 调用
printValue函数,传递a的值。此处,a的值 10 被复制到x中。
- 调用
执行结果:
Value of x: 10
2. const int &x 示例
#include <iostream>void displayValue(const int &x) {// 打印 x 的值std::cout << "Value of x: " << x << std::endl;// 尝试修改 x 的值(这会引发编译错误)// x = 20; // 错误: 'x' 是常量,不能被修改
}int main() {int a = 10;// 调用 displayValue 函数,传递整数变量的引用displayValue(a);return 0;
}
逐行解释:
-
#include <iostream>- 包含输入输出流库。
-
void displayValue(const int &x) {- 定义了一个函数
displayValue,它接受一个const int &参数x。这是一个常量整型引用,函数内部不能修改x引用的值。
- 定义了一个函数
-
std::cout << "Value of x: " << x << std::endl;- 打印
x的值。由于x是传引用的,函数内部对x的操作不会影响原始变量a的值。x直接引用a。
- 打印
-
// x = 20;- 注释掉的代码,尝试修改
x的值会引发编译错误,因为x是const的。
- 注释掉的代码,尝试修改
-
int main() {- 主函数的开始。
-
int a = 10;- 定义一个整型变量
a,并初始化为 10。
- 定义一个整型变量
-
displayValue(a);- 调用
displayValue函数,传递a的引用。此处,x引用a,所以x的值是 10。
- 调用
Value of x: 10
相关文章:
c++中加不加const的值传递和引用传递的区别
文章目录 可以修改参数值的比较值传递(int x)和引用传递(int &x)使用const不修改参数值的比较值传递(const int x)和引用传递(const int &x)1. const int x 示例2. const int &x 示例 可以修改参数值的比较值传递(int x)和引用传递(int &x) #include <iost…...
Qt的窗口设置
本文介绍Qt的窗口设置。 采用Qt开发界面程序,会涉及到窗口的设置,如窗口标题栏是否显示,是否有最小,最大化按钮等,窗口当前显示最小化,最大化等。本文简要介绍常用的窗口设置方法。 1.窗口属性 窗口属性…...
51单片机-LCD1602显示屏
简介 是一个液晶显示屏,通过电压对显示区域进行控制,有电就显示。 能够同时显示32个字符,分为两行,一行显示16个字符。可以显示的内容只能是字母、数字或者一些特殊符号。 使用ASCII码来让LCD1602来显示对应的字符。 电路图 …...
多模态分析代理 MAIA:多智能体解决 视觉模型 黑盒问题
多模态分析代理 MAIA:多智能体解决 视觉模型 黑盒问题 论文:https://arxiv.org/pdf/2404.14394 代码:https://github.com/multimodal-interpretability/maia 提出背景 神经网络方法提取的特征,没有可解释性。 数据在通过多个层…...
AT360-6T杭州中科微单频高精度授时模块场景应用
AT360-6T是一款高性能多系统卫星定位授时模块,基于自主研发的北斗多系统SOC芯片,可以同时接收中国的BDS(北斗二号和北斗三号)、美国的GPS、俄罗斯的GLONASS、欧盟的 GALILEO 和日本的QZSS等多个卫星导航系统的GNSS信号来实现多系统联合定位授时ÿ…...
Python酷库之旅-第三方库Pandas(081)
目录 一、用法精讲 336、pandas.Series.str.rpartition方法 336-1、语法 336-2、参数 336-3、功能 336-4、返回值 336-5、说明 336-6、用法 336-6-1、数据准备 336-6-2、代码示例 336-6-3、结果输出 337、pandas.Series.str.slice方法 337-1、语法 337-2、参数 …...
C语言基础⑩——构造类型(结构体)
一、数据类型分类 1、基本类型 整数型 短整型:short(2个字节);整型(默认):int(4个字节);长整型:long(8个字节)…...
宝兰德荣获openEuler项目群青铜捐赠人称号,共筑开源生态繁荣新篇章
近日,开放原子开源基金会正式公布了新增捐赠人名单,宝兰德凭借在开源领域的卓越贡献与深厚实力,被授予openEuler项目群青铜捐赠人称号。 开放原子开源基金会是致力于推动全球开源事业发展的非营利机构,于2020年6月在北京成立。开放…...
【Python单元测试】学习笔记3
文章目录 08.PyTest框架什么是PyTestPyTest的优点PyTest的测试环境PyTest常用参数跳过测试 09.PyTest fixture基础PyTest fixture定义和使用引用多个Fixture 10. conftest.pyconftest.py的用途 11. 参数化测试用例为什么需要参数化测试用例使用parameterizer插件实现使用pytest…...
OpenSSL源码编译及Debug
** 1. 环境 Linux 5.19.0-14-generic 22.04.1-Ubuntu 2. 所需工具 gcc version 11.3.0 (Ubuntu 11.3.0-1ubuntu1~22.04) cmake version 3.22.1 3. 步骤 3.1 获取openssl源码 方法可以git clone获得源码,或者直接去GitHub上下载压缩包,GitHub网址…...
go之goburrow/modbus 学习
goburrow/modbus 是一个用Go语言实现的Modbus协议库,提供了Modbus主机(Master)和从机(Slave)的实现,支持两种主要的Modbus传输模式:Modbus TCP和Modbus RTU。 功能介绍 1. 支持的传输模式 Mod…...
开放词汇目标检测(Open-Vocabulary Object Detection, OVOD)算法是什么?
开放词汇目标检测(Open-Vocabulary Object Detection, OVOD)算法是什么? 随着计算机视觉技术的快速发展,目标检测(Object Detection)已经在各种应用场景中得到了广泛的应用。然而,传统的目标检…...
【教程】Ubuntu给pycharm添加侧边栏快捷方式
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 以下教程不仅限于pycharm,其他软件也是一样操作 1、进入到pycharm的目录,先通过命令行打开pycharm: ./bin/pycharm…...
三个月外贸小白好迷茫,该何去何从?
最近看到一个共性的问题,也许对于大多数外贸新人来说,都有过这样的困扰和无力感,也许对于每一个没有强大背景的外贸小伙伴来说,可能都是这样一路成长起来的。 大家好,我是一名普通二本英专生,八月中旬入职…...
MySQL数据库——基本查询(Create)
CRUD:Create(创建)Retrieve(读取)Update(更新)Delete(删除) 1.Create ①单行数据全列插入 insert [into] table_name [(colume[,colume]……)] values (value_list) […...
spring-security-1-快速入门
1 功能 身份认证(authentication)授权(authorization)防御常见攻击 身份认证:常见账号密码登录,短信登录 授权:什么样的角色,能看见什么菜单,能访问哪些接口。 2 pom <dependency><groupId>org.springf…...
5 大场景上手通义灵码企业知识库 RAG
大家好,我是通义灵码,你的智能编程助手!最近我又升级啦,智能问答功能全面升级至 Qwen2,新版本在各个方面的性能和准确性都得到了显著提升。此外,行间代码补全效果也全面优化,多种编程语言生成性…...
免费远程控制电脑的软件有哪些?
什么是远程控制? 远程控制是一种通过网络从一台设备操作另一台设备的技术。连接后,用户可以直接远程操作那台电脑进行各种操作。随着科技的不断进步和用户需求的增加,远程控制市场日益蓬勃。远程控制不仅应用于远程办公和远程教学࿰…...
Linux软件包yum
目录 Linux软件包管理器 yum关于rzsz注意事项查看软件包如何安装软件卸载命令 Linux开发工具Linux编辑器-vim使用1. vim的基本概念2. vim的基本操作3. vim正常模式命令集4. vim末行模式命令集5. vim操作总结 小彩蛋 Linux软件包管理器 yum 软件包 在Linux下安装软件ÿ…...
网页的切换与嵌套
网页的切换与嵌套 网页的切换 在浏览器窗口中如果点击超链接标签会在当前的浏览器窗口中显示新的数据,但有些超链接标签点击后却会在一个新的窗口显示数据,这种情况下就无法对新的开的窗口页面进行操作了。 基于这种情况,我们就需要使用dri…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...
数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)
名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 原创笔记:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:《数据结构第4章 数组和广义表》…...
