C++值传递和引用传递

news2025/3/29 8:18:36

系列文章目录

值传递和引用传递是 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 

总结

特性值传递引用传递常量引用传递
是否复制数据
是否能修改原始数据
性能较低(需要复制数据)较高(直接操作原始数据)较高(避免复制且不可修改)
使用场景数据简单且不需要修改原始数据需要修改原始数据只需读取数据而不修改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2322332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LangChain4J开源开发框架简介

目录 1.1、前言1.2、集成方式简单1.3、核心功能与优势1.4、两种调用方式1.5、链式调用示例代码1.6、AI服务调用示例代码1.7、典型使用场景1.8、总结 1.1、前言 LangChain4J 是一个专为 Java 开发者设计的开源框架&#xff0c;旨在简化大型语言模型&#xff08;LLMs&#xff09;…

SpringBoot集成Elasticsearch 7.x spring-boot-starter-data-elasticsearch 方式

SpringBoot集成Elasticsearch 7.x | spring-boot-starter-data-elasticsearch 方式 前言添加maven依赖配置application.properties测试实体类 方式一&#xff1a;继承 ElasticsearchRepository&#xff08;适合简单查询&#xff09; 直接使用想自定义自己的Repository接口 方式…

STM32蜂鸣器播放音乐

STM32蜂鸣器播放音乐 STM32蜂鸣器播放音乐 Do, Re, Mi, Fa, 1. 功能概述 本系统基于STM32F7系列微控制器&#xff0c;实现了以下功能&#xff1a; 通过7个按键控制蜂鸣器发声&#xff0c;按键对应不同的音符。每个按键对应一个音符&#xff08;Do, Re, Mi, Fa, Sol, La, Si&a…

解码未来:DeepSeek开源FlashMLA,推理加速核心技术,引领AI变革

前言&#xff1a; DeepSeek 兑现了自己的诺言&#xff0c;开源了一款用于 Hopper GPU 的高效型 MLA 解码核&#xff1a;FlashMLA。 项目地址&#xff1a;https://github.com/deepseek-ai/FlashMLA 1:FlashMLA 是什么呀&#xff1f; MLA是DeepSeek大模型的重要技术创新点&…

leetcode:136. 只出现一次的数字(python3解法)

难度&#xff1a;简单 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 示例 1 &#xf…

Isaac Sim与Isaac Lab初使用

目录 基于Omiverse下载Isaacsim安装Isaac Lab配置isaacsim环境测试克隆仓库配置python环境强化学习训练的测试 IsaacLab模板配置vscode环境ros接口安装 作为nvidia出品的仿真软件&#xff0c;很多机器人、机器狗【具身智能】都可以有很不错的效果&#xff0c;所以会使用isaac s…

Spring AI Alibaba 工具(Function Calling)使用

一、工具(Function Calling)简介 Spring AI Alibaba工具(Function Calling)&#xff1a;https://java2ai.com/docs/1.0.0-M6.1/tutorials/function-calling/ 1、工具(Function Calling) “工具&#xff08;Tool&#xff09;”或“功能调用&#xff08;Function Calling&#xf…

Touch Diver:Weart为XR和机器人遥操作专属设计的触觉反馈动捕手套

在虚拟现实&#xff08;VR&#xff09;和扩展现实&#xff08;XR&#xff09;领域&#xff0c;触觉反馈技术正逐渐成为提升沉浸感和交互体验的重要因素。Weart作为这一领域的创新者&#xff0c;凭借其TouchDIVER Pro和TouchDIVER G1触觉手套&#xff0c;为用户带来了高度逼真的…

[深度学习]图片分类任务

图片分类任务 文章目录 图片分类任务分类任务回归和分类如何做分类的输出 图片分类卷积神经网络保持特征图大小不变更大的卷积核和更多的卷积核层数特征图怎么变小卷积神经网络中特征图改变卷积到全连接分类任务的LOSS一个基本的分类神经网络 经典神经网络AlexNetVggNetResNet …

Nodejs 项目打包部署方式

方式一&#xff1a;PM2 一、准备工作 确保服务器上已安装 Node.js 环境建议使用 PM2 进行进程管理&#xff08;需要额外安装&#xff09; 二、部署步骤 1.首先在服务器上安装 PM2&#xff08;推荐&#xff09;&#xff1a; npm install -g pm22.将项目代码上传到服务器&…

C++类与对象的的第三个简单的实战练习-3.25笔记

哔哩哔哩C面向对象高级语言程序设计教程&#xff08;118集全&#xff09; 简单实战三 创建项目 打开VS&#xff0c;点击创建一个新项目 创建一个空项目 点击下一步 点击工程名称&#xff0c;选择添加 选择新建项 选择C类 取名 点击确定&#xff0c;这时候还需要一个main.cpp …

HarmonyOS-ArkUI Grip组件

我们在学习List的时候&#xff0c;已经捎带引入了Grid。讲解如下图所示&#xff1a; 也就是&#xff0c;如果一个表&#xff0c;长宽基本都是一致的&#xff0c;那么此时可以完全不用Grid也可以实现&#xff0c;并且&#xff0c;优先考虑的就是List。 如果List实现不了的情况下…

2025清华大学:DeepSeek教程全集(PDF+视频精讲,共10份).zip

一、资料列表 第一课&#xff1a;Deepseek基础入门 第二课&#xff1a;DeepSeek赋能职场 第三课&#xff1a;普通人如何抓住DeepSeek红利 第四课&#xff1a;让科研像聊天一样简单 第五课&#xff1a;DeepSeek与AI幻觉 第六课&#xff1a;基于DeepSeek的AI音乐词曲的创造法 第…

mac vim命令快捷键

目录 移动光标插入模式复制/粘贴删除搜索/替换退出 移动光标 快捷键说明0 / ^跳到行首&#xff0c;移动到光标所在行的"行首"$跳到行末&#xff0c;移动到光标所在行的"行尾"gg跳到文件第一行G移动到文章的最后[n]G跳到第n行w光标跳到下个字的开头e光标跳…

低代码配置式Web组态解析

低代码配置式Web组态技术通过可视化操作和预置组件库&#xff0c;大幅降低开发门槛&#xff0c;适用于工业控制、物联网监控、数据可视化等场景。以下是综合行业实践和产品特性的分析&#xff1a; ‌一、核心功能与优势‌ ‌可视化编辑与拖拽布局‌ 提供图形化编辑器&#xff0…

基于web的家政服务网站

内容摘要 由于互联网的使用&#xff0c;人们在管理、应用、服务等领域使用数据更加简洁、方便&#xff0c;大大提高了工作效率。互联网正逐渐融入我们的生活&#xff0c;影响和改变我们的生活。 家政服务管理系统是典型的信息管理系统&#xff08;MIS&#xff09;。其开发主要…

聚水潭数据集成到MySQL的最佳实践分享

聚水潭数据集成到MySQL的技术案例分享 在本次技术案例中&#xff0c;我们将探讨如何通过轻易云数据集成平台&#xff0c;将聚水潭的数据高效、可靠地集成到MySQL数据库中。具体的集成方案为“聚水潭-商品信息查询-->BI初本-商品信息表_copy”。该方案旨在实现从聚水潭获取商…

线性代数核心概念与NumPy科学计算实战全解析

前言 学习方法&#xff1a; 思维导图&#xff0c;梳理 多记忆&#xff0c;函数名和功能&#xff0c;参数 学会应用&#xff0c;不要钻牛角尖 一、浅解线性代数 1.1标量 标量是一个只有大小没有方向的量。在数学上&#xff0c;标量通常表示为一个普通的数字&#xff0c;如‌质量…

C#自定义曲线便器功能实现(简化版)

目录 一、曲线编辑器实现功能 二、实现方法说明 三、关键代码说明 1、绘制背景板和曲线 2、绘制坐标系面板 3、绘制曲线 四、工程下载连接 一、曲线编辑器实现功能 添加或者删除控制点&#xff0c;通过移动控制点来修改曲线形状 二、实现方法说明 1、坐标系系统&#x…

解锁U盘属性0字节困境,重获数据生机

在数字化浪潮中&#xff0c;U盘宛如一位忠诚的“数据信使”&#xff0c;频繁穿梭于各种设备之间&#xff0c;为我们存储和传输着重要信息。然而&#xff0c;当U盘突然显示属性为0字节时&#xff0c;就如同这位信使突然“失声”&#xff0c;让我们陷入了数据丢失的恐慌之中。U盘…