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

【cpp Trip第4站】函数参数传递

cpp函数参数传递方式

在 C++ 中,函数参数传递主要有三种方式:传值(Pass by Value)传引用(Pass by Reference)传指针(Pass by Pointer)。它们各有特点和适用场景,下面详细解释:


1. 传值(Pass by Value)

  • 机制:将实际参数的值复制给形式参数,函数内对形参的修改不会影响实参。
  • 优点:简单安全,避免了原始数据被意外修改。
  • 缺点:对于大型结构体或对象,复制开销较大。
  • 示例
    void modify(int x) {x = 10; // 只修改局部副本
    }
    int main() {int a = 5;modify(a);cout << a; // 输出 5(未被修改)
    }
    

2. 传引用(Pass by Reference)

  • 机制:形式参数是实际参数的别名(引用),函数内对形参的修改直接影响实参。
  • 优点
    • 避免复制开销(尤其适合大型对象)。
    • 允许函数修改实参(可通过 const 引用避免修改)。
  • 示例
    void modify(int &x) {x = 10; // 修改实参
    }
    int main() {int a = 5;modify(a);cout << a; // 输出 10(已被修改)
    }
    
  • 常量引用(const T&:用于只读访问,避免复制且防止修改:
    void print(const std::string &s) {cout << s; // 不能修改 s
    }
    

3. 传指针(Pass by Pointer)

  • 机制:传递实参的地址(指针),函数内通过解引用(*)修改实参。
  • 优点
    • 明确表示参数可能被修改(需检查代码逻辑)。
    • 可以传递“空指针”(nullptr)表示可选参数。
  • 缺点:语法稍复杂,需注意空指针安全问题。
  • 示例
    void modify(int *x) {if (x) *x = 10; // 检查空指针后修改
    }
    int main() {int a = 5;modify(&a);     // 传递地址cout << a;      // 输出 10
    }
    

对比与选择建议:

方式是否修改实参复制开销安全性适用场景
传值高(隔离修改)基本类型、小型结构体
传引用是(除非const)需注意(可能误修改)需要修改实参或避免复制的大型对象
传指针是(需解引用)需检查空指针明确需修改、可选参数或C风格接口

补充:C++11 后的移动语义(Move Semantics)

对于大型对象(如 std::vector),除了传引用,还可以使用传值 + 移动语义(通过 std::move)避免复制:

void process(std::string s) { // 传值,但接受移动构造// 使用 s(可能被移动而来)
}
int main() {std::string data = "hello";process(std::move(data)); // 移动而非复制
}

总结:

  • 优先使用 传引用(特别是 const T&)来避免复制。
  • 需要修改实参时,用非常量引用指针(指针更明确,但引用更简洁)。
  • 基本类型(如 int)可直接传值
  • 考虑移动语义(C++11+)来优化大型对象的传值。

根据具体需求(是否修改、性能要求、代码清晰度)灵活选择!

http://www.dtcms.com/a/390498.html

相关文章:

  • 【Spotfire】实现错行效果
  • 【Day 61】Linux-haproxy负载均衡
  • 搭建线上线下融合的商城小程序,关键步骤有哪些?
  • 软件测试教程资源合集
  • Proteus(8.17)SP2 仿真下载安装过程(附详细安装过程图)
  • 微软获评 2025 Gartner 云原生应用平台魔力象限 领导者
  • Java 生态监控体系实战:Prometheus+Grafana+SkyWalking 整合全指南(一)
  • 【学习】响应系统
  • Linux网络:socket网络套接字
  • 知识图谱对人工智能中自然语言处理的深层语义分析的影响与启示
  • 从车间到云端:Kepware如何加速IIoT落地
  • MyISAM 与 InnoDB 深度对比:如何正确选择 MySQL 存储引擎
  • 串口无线数传模块实现化工园区与3公里外水泵PLC无线通讯实现设备数据传输
  • rook-ceph自定义添加osd流程
  • 【需求导向】解读660页智慧教育大数据信息化顶层设计及智慧应用建设方案
  • InnoDB 引擎深潜指南---从逻辑结构到 MVCC 原理,带源码级案例与性能要点
  • Android Compose 开发 界面间的跳转(Router)
  • unity(C#/cs)请求 python django后端服务器预制体渲染 scroll list 视频列表
  • 《Linux 指令实战进阶:从终端新手到 shell 驾驭者的技术跃迁(第三篇)》
  • 临床AI产品化全流程研究:环境聆听、在环校验与可追溯系统的多技术融合实践(下)
  • Croe 11.0 学习笔记:1.5 草绘
  • Hadoop 1.x 与 2.x 版本对比:架构演进与核心差异解析
  • 【5/20】Express.js 基础:构建 RESTful API,实现用户数据端点
  • SmartX 榫卯企业云平台+ StarRocks 大数据联合解决方案
  • CodeX 新王已来:从技术原理到工程实践,AI 如何重构编程全流程
  • 智慧赋能:King‘s Biobank 重构生物样本管理新范式
  • Chromium 138 编译指南 Ubuntu 篇:环境配置与基础准备(一)
  • 知识库新增三方应用AI问答,新增标签管理,集成Excalidraw,重构全文检索,zyplayer-doc 2.5.4 发布啦!
  • JupyterLab部署及使用
  • 本地连接服务器使用jupyter