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

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;
}
  1. 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。这是值传递,xa 的副本。
  • 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。
  1. 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。
  1. 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 的值传递给函数。函数内部的 xa 的副本,对 x 的修改不会影响 a
  • std::cout << "After modifyByValue:" << std::endl;:打印在调用 modifyByValue 函数之后 a 的值。
  • std::cout << " a: " << a << std::endl;:打印 a 的值,结果仍然是 10,因为 modifyByValue 函数中的修改不影响原始变量。
  • modifyByReference(a);:调用 modifyByReference 函数,将 a 的引用传递给函数。函数内部的 xa 的引用,对 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 xconst int &x 的区别

在 C++ 中,const 关键字用于定义常量,意味着被修饰的变量的值不能被修改。const 可以与传值和传引用都不能改变元素值 的方式结合使用,效果有所不同。

  • const int xx 是一个常量整型参数,函数内部不能修改 x 的值。x 是以值的方式传递的,这意味着函数内部使用的是 x 的副本,而不是原始变量的引用。这种方式适用于传递小的基本数据类型。

  • const int &xx 是一个常量整型的引用,函数内部不能修改 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;
}
  1. #include <iostream>

    • 包含输入输出流库,用于标准输入输出操作。
  2. void printValue(const int x) {

    • 定义了一个函数 printValue它接受一个 const int 参数 xx 是一个常量整型参数,函数内部不能修改它的值。
  3. std::cout << "Value of x: " << x << std::endl;

    • 打印 x 的值。由于 x 是传值的,函数内部对 x 的操作不会影响原始变量 a 的值。
  4. // x = 20;

    • 注释掉的代码,尝试修改 x 的值会引发编译错误,因为 xconst 的。
  5. int main() {

    • 主函数的开始。
  6. int a = 10;

    • 定义一个整型变量 a,并初始化为 10。
  7. 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;
}

逐行解释:

  1. #include <iostream>

    • 包含输入输出流库。
  2. void displayValue(const int &x) {

    • 定义了一个函数 displayValue它接受一个 const int & 参数 x。这是一个常量整型引用,函数内部不能修改 x 引用的值。
  3. std::cout << "Value of x: " << x << std::endl;

    • 打印 x 的值。由于 x 是传引用的,函数内部对 x 的操作不会影响原始变量 a 的值。x 直接引用 a
  4. // x = 20;

    • 注释掉的代码,尝试修改 x 的值会引发编译错误,因为 xconst 的。
  5. int main() {

    • 主函数的开始。
  6. int a = 10;

    • 定义一个整型变量 a,并初始化为 10。
  7. 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开发界面程序&#xff0c;会涉及到窗口的设置&#xff0c;如窗口标题栏是否显示&#xff0c;是否有最小&#xff0c;最大化按钮等&#xff0c;窗口当前显示最小化&#xff0c;最大化等。本文简要介绍常用的窗口设置方法。 1.窗口属性 窗口属性…...

51单片机-LCD1602显示屏

简介 是一个液晶显示屏&#xff0c;通过电压对显示区域进行控制&#xff0c;有电就显示。 能够同时显示32个字符&#xff0c;分为两行&#xff0c;一行显示16个字符。可以显示的内容只能是字母、数字或者一些特殊符号。 使用ASCII码来让LCD1602来显示对应的字符。 电路图 …...

多模态分析代理 MAIA:多智能体解决 视觉模型 黑盒问题

多模态分析代理 MAIA&#xff1a;多智能体解决 视觉模型 黑盒问题 论文&#xff1a;https://arxiv.org/pdf/2404.14394 代码&#xff1a;https://github.com/multimodal-interpretability/maia 提出背景 神经网络方法提取的特征&#xff0c;没有可解释性。 数据在通过多个层…...

AT360-6T杭州中科微单频高精度授时模块场景应用

AT360-6T是一款高性能多系统卫星定位授时模块&#xff0c;基于自主研发的北斗多系统SOC芯片&#xff0c;可以同时接收中国的BDS(北斗二号和北斗三号)、美国的GPS、俄罗斯的GLONASS、欧盟的 GALILEO 和日本的QZSS等多个卫星导航系统的GNSS信号来实现多系统联合定位授时&#xff…...

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、基本类型 整数型 短整型&#xff1a;short&#xff08;2个字节&#xff09;&#xff1b;整型&#xff08;默认&#xff09;&#xff1a;int&#xff08;4个字节&#xff09;&#xff1b;长整型&#xff1a;long&#xff08;8个字节&#xff09;&#xf…...

宝兰德荣获openEuler项目群青铜捐赠人称号,共筑开源生态繁荣新篇章

近日&#xff0c;开放原子开源基金会正式公布了新增捐赠人名单&#xff0c;宝兰德凭借在开源领域的卓越贡献与深厚实力&#xff0c;被授予openEuler项目群青铜捐赠人称号。 开放原子开源基金会是致力于推动全球开源事业发展的非营利机构&#xff0c;于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获得源码&#xff0c;或者直接去GitHub上下载压缩包&#xff0c;GitHub网址&#xf…...

go之goburrow/modbus 学习

goburrow/modbus 是一个用Go语言实现的Modbus协议库&#xff0c;提供了Modbus主机&#xff08;Master&#xff09;和从机&#xff08;Slave&#xff09;的实现&#xff0c;支持两种主要的Modbus传输模式&#xff1a;Modbus TCP和Modbus RTU。 功能介绍 1. 支持的传输模式 Mod…...

开放词汇目标检测(Open-Vocabulary Object Detection, OVOD)算法是什么?

开放词汇目标检测&#xff08;Open-Vocabulary Object Detection, OVOD&#xff09;算法是什么&#xff1f; 随着计算机视觉技术的快速发展&#xff0c;目标检测&#xff08;Object Detection&#xff09;已经在各种应用场景中得到了广泛的应用。然而&#xff0c;传统的目标检…...

【教程】Ubuntu给pycharm添加侧边栏快捷方式

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 以下教程不仅限于pycharm&#xff0c;其他软件也是一样操作 1、进入到pycharm的目录&#xff0c;先通过命令行打开pycharm&#xff1a; ./bin/pycharm…...

三个月外贸小白好迷茫,该何去何从?

最近看到一个共性的问题&#xff0c;也许对于大多数外贸新人来说&#xff0c;都有过这样的困扰和无力感&#xff0c;也许对于每一个没有强大背景的外贸小伙伴来说&#xff0c;可能都是这样一路成长起来的。 大家好&#xff0c;我是一名普通二本英专生&#xff0c;八月中旬入职…...

MySQL数据库——基本查询(Create)

CRUD&#xff1a;Create&#xff08;创建&#xff09;Retrieve&#xff08;读取&#xff09;Update&#xff08;更新&#xff09;Delete&#xff08;删除&#xff09; 1.Create ①单行数据全列插入 insert [into] table_name [(colume[,colume]……)] values (value_list) […...

spring-security-1-快速入门

1 功能 身份认证(authentication)授权(authorization)防御常见攻击 身份认证&#xff1a;常见账号密码登录&#xff0c;短信登录 授权&#xff1a;什么样的角色&#xff0c;能看见什么菜单&#xff0c;能访问哪些接口。 2 pom <dependency><groupId>org.springf…...

5 大场景上手通义灵码企业知识库 RAG

大家好&#xff0c;我是通义灵码&#xff0c;你的智能编程助手&#xff01;最近我又升级啦&#xff0c;智能问答功能全面升级至 Qwen2&#xff0c;新版本在各个方面的性能和准确性都得到了显著提升。此外&#xff0c;行间代码补全效果也全面优化&#xff0c;多种编程语言生成性…...

免费远程控制电脑的软件有哪些?

什么是远程控制&#xff1f; 远程控制是一种通过网络从一台设备操作另一台设备的技术。连接后&#xff0c;用户可以直接远程操作那台电脑进行各种操作。随着科技的不断进步和用户需求的增加&#xff0c;远程控制市场日益蓬勃。远程控制不仅应用于远程办公和远程教学&#xff0…...

Linux软件包yum

目录 Linux软件包管理器 yum关于rzsz注意事项查看软件包如何安装软件卸载命令 Linux开发工具Linux编辑器-vim使用1. vim的基本概念2. vim的基本操作3. vim正常模式命令集4. vim末行模式命令集5. vim操作总结 小彩蛋 Linux软件包管理器 yum 软件包 在Linux下安装软件&#xff…...

网页的切换与嵌套

网页的切换与嵌套 网页的切换 在浏览器窗口中如果点击超链接标签会在当前的浏览器窗口中显示新的数据&#xff0c;但有些超链接标签点击后却会在一个新的窗口显示数据&#xff0c;这种情况下就无法对新的开的窗口页面进行操作了。 基于这种情况&#xff0c;我们就需要使用dri…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...