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

C++(17):引用传参

目录

一、核心概念

二、代码示例:对比指针和引用

1. 指针传参的问题

2. 引用传参的改进

三、引用传参的优势

四、总结


一、核心概念

  1. 别名机制:引用是变量的别名,操作引用等同于操作原变量。

  2. 避免拷贝:直接操作原始变量,无需拷贝数据(适合大型对象)。

  3. 语法简洁:无需像指针一样使用*->,代码更清晰。

  4. 原地修改:函数内对引用的修改会直接影响调用方的变量。


二、代码示例:对比指针和引用

1. 指针传参的问题
// 指针传参:需要解引用,语法复杂
void swap_ptr(int* a, int* b) {int temp = *a;  // 解引用*a = *b;        // 注意符号优先级问题(如 *a++ 可能错误)*b = temp;
}int main() {int x = 1, y = 2;swap_ptr(&x, &y);  // 必须显式取地址
}
2. 引用传参的改进
// 引用传参:直接操作变量,无需解引用
void swap_ref(int& a, int& b) {int temp = a;  // 语法与操作普通变量一致a = b;         // 直接修改原变量b = temp;
}int main() {int x = 1, y = 2;swap_ref(x, y);  // 直接传变量,无需取地址
}

三、引用传参的优势

  1. 避免拷贝开销
    传递大型结构体或类时,引用传参无需复制整个对象:

    struct BigData { int data[1000]; };// 值传递:拷贝整个结构体(低效)
    void processByValue(BigData data) { /*...*/ }// 引用传递:直接操作原对象(高效)
    void processByRef(BigData& data) { /*...*/ }
  2. 代码可读性
    引用语法更接近普通变量,无需处理*->

    // 指针版本:需要解引用
    void increment_ptr(int* num) { (*num)++; }// 引用版本:直接操作
    void increment_ref(int& num) { num++; }
  3. 避免符号优先级问题
    指针操作可能因优先级引发错误,引用天然规避此问题:

    void func_ptr(int* ptr) {(*ptr)++;  // 必须加括号,否则变成 ptr++
    }void func_ref(int& ref) {ref++;  // 无需担心优先级
    }
  4. 支持 const 引用
    通过const引用避免意外修改,同时保持高效:

    // 只读访问,不拷贝且保护原数据
    void readData(const BigData& data) {std::cout << data.value;
    }

四、总结

        引用传参结合了值传递的简洁性和指针传递的高效性:避免拷贝、语法简洁、支持原地修改。

适用场景:需要修改实参或传递大型对象时。

注意事项:引用必须绑定有效变量(不能为空),且无法重新绑定其他变量。

http://www.xdnf.cn/news/6616.html

相关文章:

  • 从关键字执行机制入手理解 Robot Framework 源码
  • 【Opencv】canny边缘检测提取中心坐标
  • 2025第三届盘古初赛(计算机部分)
  • 中天智能装备有限公司在柔性立库设备方面有哪些产品?
  • vue复杂数据类型多层嵌套的监听
  • Python之三大基本库——Matplotlib
  • 基于 React Hook 封装 Store 的三种方案
  • 嵌入式故障码管理系统设计实现
  • 问题 | 国内外软件定义卫星最新进展研究
  • MySQL 高可用
  • DevExpressWinForms-RichEditControl-基础应用
  • 若依框架SpringBoot从Mysql替换集成人大金仓(KingBase)数据库
  • 【linux unbind 设备驱动】
  • API 加速方案:如何使用 Redis 与 Memcached 进行高效缓存优化
  • SpringBoot常用注解详解
  • 【蓝桥杯省赛真题50】python字母比较 第十五届蓝桥杯青少组Python编程省赛真题解析
  • ubuntu22鼠键失灵恢复记录笔记chatgpt解决
  • JavaScript性能优化实战(10):前端框架性能优化深度解析
  • nosqlbooster pojie NoSQLBooster for MongoDB
  • Android studio 实现弹出表单编辑界面
  • Cadence sch 删除原理图位号下划线
  • neo4j框架:ubuntu系统中neo4j安装与使用教程
  • c++20引入的三路比较操作符<=>
  • Linux-进程概念(一)
  • WAS和Tomcat的对比
  • 如何查询Ubuntu系统中最大的几个目录以G单位显示大小,从大到小排列?
  • 我用 CodeBuddy 开发了一个颜色命名搜索器 —— ColorNameHub 的诞生记
  • 在 Kotlin 中,什么是解构,如何使用?
  • 探索嵌入式硬件的世界:技术、应用与未来趋势
  • 知识蒸馏实战:用PyTorch和预训练模型提升小模型性能