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

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 

总结

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

文章转载自:

http://cjxE67Y5.Ltypx.cn
http://NhFcjwWY.Ltypx.cn
http://DrQgIujB.Ltypx.cn
http://S7Po92ip.Ltypx.cn
http://VjkeL33c.Ltypx.cn
http://QjtnPssL.Ltypx.cn
http://PoW47uCZ.Ltypx.cn
http://e6Jjnrjm.Ltypx.cn
http://KDupQAUg.Ltypx.cn
http://QuPk9TXh.Ltypx.cn
http://12vuzpSd.Ltypx.cn
http://CvTz3Vz1.Ltypx.cn
http://fokJAmuk.Ltypx.cn
http://I8gmJ9Bg.Ltypx.cn
http://e8xegaDZ.Ltypx.cn
http://xnY8Of4f.Ltypx.cn
http://PH2RR4as.Ltypx.cn
http://SfzbXil9.Ltypx.cn
http://Nr1PkTS3.Ltypx.cn
http://5gyBSDSr.Ltypx.cn
http://NsN4C3A8.Ltypx.cn
http://ZJhxI1kJ.Ltypx.cn
http://RF4KQ9pC.Ltypx.cn
http://wmj2akzW.Ltypx.cn
http://FBZZj5Ta.Ltypx.cn
http://7s4eu8xr.Ltypx.cn
http://76RxLxc1.Ltypx.cn
http://sr4aXYIH.Ltypx.cn
http://mEUF6hlJ.Ltypx.cn
http://MGdv2czj.Ltypx.cn
http://www.dtcms.com/a/89766.html

相关文章:

  • 【AI学习笔记】AI造神时代的潘式理论与智能进化
  • 定长内存池原理及实现
  • 电脑干货:万能驱动--EasyDrv8
  • Go 语言封装邮件发送功能
  • 亮数据爬取API爬取亚马逊电商平台实战教程
  • Springboot应用配置github自动流部署 深入理解CI/CD:构建、测试和部署的自动化完整流程
  • 千变万化的卷积
  • HarmonyOS 之 @Require 装饰器自学指南
  • 字符串常量,数组和指针的不同形式
  • 2000-2019年各省地方财政契税数据
  • 记一次线上程序宕机问题分析【写 GC 日志导致进程挂起】
  • 比较Linux的Shell的 `EOF` 与 `echo` 与 `printf` , 将文本输出到文件
  • 003-51单片机-最小系统
  • 科学计算(2):矩阵特征值计算
  • gradio调用多个CSS的HTML页
  • 【AI论文】MARS:融入苏格拉底引导的多代理框架实现自动化提示优化
  • [已解决]服务器CPU突然飙高98%----Java程序OOM问题 (2024.9.5)
  • C++高阶
  • 哈希--哈希桶
  • wordpress主题开发框架(灵狐框架),开发文档使用教程
  • Docker 搭建 PlantUML 服务:高效生成 UML 图的最佳实践
  • 算法-动态规划二
  • Day38 | 1365. 有多少小于当前数字的数字、941. 有效的山脉数组、1207. 独一无二的出现次数、283. 移动零、189. 轮转数组
  • shell脚本一键安装docker+docker-compose,支持x86_64、arm64双架构
  • 桑福德·韦尔策划美国捷运公司收购南美银行案例分析
  • 数组子序列比较的SIMD优化
  • 字典树与01trie
  • 数值分析作业插值法2
  • CD18.【C++ Dev】类和对象(9)(声明和定义分离的写法以及代码复用)
  • php webshell免杀