news 2026/6/24 22:24:02

C++ 函数参数传递方式总结:什么时候用值传递、引用、const 引用?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 函数参数传递方式总结:什么时候用值传递、引用、const 引用?

在 C++ 开发中,一个经常让人困惑的问题是:

函数参数到底该写TT&,还是const T&

很多人只记住一句话:
大对象用 const 引用,小对象用值传递
但背后的逻辑如果不理解,实际写代码时还是会犹豫。

这篇文章我们从性能、语义、工程实践三个角度,把参数传递方式一次讲清楚。

一、C++ 三种常见参数形式

1. 值传递(Pass by Value)

void f(T x);

特点:

  • 拷贝一份对象
  • 函数内部改x,不会影响外部
  • 简单直接

适用场景:

  • 小类型(int / double / bool / enum)
  • 函数需要“收下这份数据”
  • 要存入成员变量 / 容器

2. 引用传递(Pass by Reference)

void f(T& x);

特点:

  • 不拷贝,直接操作原对象
  • 可以修改调用者的数据

适用场景:

  • 明确要修改调用者对象
  • 工具函数 / 算法函数 / swap / normalize 等

3. 常量引用(Pass by Const Reference)

void f(const T& x);

特点:

  • 不拷贝
  • 不允许修改
  • 性能好 + 语义清晰

适用场景:

  • 大对象只读访问
  • 打印 / 比较 / 计算 / 日志 / 序列化
  • std::string / vector / map / 自定义类

二、为什么不用const T(值传 const)?

很多人会写:

void f(const std::string s);

这其实意义不大,因为:

  • 仍然会拷贝
  • const 只限制函数内部
  • 外部对象本来就不会被影响

所以:

const T不能省拷贝,
const T&才能省拷贝。

三、性能视角:什么时候会浪费资源?

大对象

void f(std::string s); // 会拷贝 void f(const std::string& s); // 不拷贝

拷贝 string / vector 可能涉及:

  • 内存分配
  • 数据复制
  • 构造析构

这是真正的资源浪费。

小对象

void f(int x); // 推荐 void f(const int& x); // 没必要

原因:

  • int 只有 4 字节
  • 引用反而传 8 字节地址
  • CPU 寄存器传值更快

四、现代 C++ 的一个重要写法:值传 + move

当函数需要保存参数时,推荐这样写:

class User { std::string name; public: void setName(std::string n) { name = std::move(n); } };

优点:

  • 左值调用:会拷贝
  • 右值调用:直接移动
  • 接口统一,调用舒服

这是现代 C++ 很常见的工程写法。

五、工程实践决策表

三个判断问题

1. 是否需要修改调用者?
  • 是 →T&

  • 否 → 继续

2. 是否是小类型?
  • 是 →T

  • 否 → 继续

3. 是否要保存参数?
  • 是 →T + move

  • 否 →const T&

六、快速记忆口诀

可以直接背这一句:

改它:T&
小的:T
大的只读:const T&
要收下:T + move

七、典型示例对照

小类型

void setAge(int age);

大对象只读

void print(const std::string& s);

修改对象

void normalize(std::vector<int>& v);

存储对象

void setName(std::string name);

八、总结

C++ 参数传递的本质不是语法问题,而是:

  • 性能
  • 语义表达
  • 工程可维护性

真正的原则不是死记硬背,而是理解:

我是“借来看一眼”,
还是“要动它”,
还是“要收下它”。

理解这一点,你写出的函数签名就会自然、专业、工程化。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 18:32:58

Qwen-Image-2512-ComfyUI优化建议:这样设置速度更快

Qwen-Image-2512-ComfyUI优化建议&#xff1a;这样设置速度更快 你有没有遇到过这样的情况&#xff1a;在ComfyUI里加载Qwen-Image-2512后&#xff0c;点下“队列”按钮&#xff0c;光是预热就卡住十几秒&#xff1f;生成一张25122512的图&#xff0c;等了快两分钟才看到进度条…

作者头像 李华
网站建设 2026/6/15 16:55:17

MedGemma-X保姆级教程:从安装到应用的完整指南

MedGemma-X保姆级教程&#xff1a;从安装到应用的完整指南 1 为什么你需要MedGemma-X&#xff1a;不是又一个CAD工具&#xff0c;而是你的放射科AI搭档 1.1 它解决的不是技术问题&#xff0c;而是临床工作流的“卡点” 你有没有遇到过这些场景&#xff1f; 一上午看了32张胸…

作者头像 李华
网站建设 2026/6/20 15:13:28

Joy-Con Toolkit完全指南:从入门到精通的5个核心技巧

Joy-Con Toolkit完全指南&#xff1a;从入门到精通的5个核心技巧 【免费下载链接】jc_toolkit Joy-Con Toolkit 项目地址: https://gitcode.com/gh_mirrors/jc/jc_toolkit Joy-Con Toolkit是一款功能强大的手柄配置工具&#xff0c;能帮助您实现手柄配置优化、体感优化和…

作者头像 李华
网站建设 2026/6/10 20:42:56

BarTender文档密码保护与部分内容锁定打印指南

1. BarTender文档密码保护的核心价值 在日常标签设计和打印工作中&#xff0c;我们经常会遇到这样的场景&#xff1a;模板已经设计好了固定格式&#xff08;比如公司LOGO、产品参数表格&#xff09;&#xff0c;但需要让不同部门的同事填写可变内容&#xff08;比如生产日期、…

作者头像 李华
网站建设 2026/6/24 12:33:02

5分钟搞定!Qwen3-VL:30B企业级智能助手飞书接入全攻略

5分钟搞定&#xff01;Qwen3-VL:30B企业级智能助手飞书接入全攻略 你是不是也遇到过这样的场景——团队每天在飞书里收发上百条消息&#xff0c;却没人能自动整理会议纪要、没人能实时解读上传的合同截图、没人能帮销售快速生成客户跟进话术&#xff1f;更别说那些散落在群聊里…

作者头像 李华
网站建设 2026/6/16 5:53:14

QWEN-AUDIO快速部署:基于CUDA 12.1的RTX显卡兼容性验证

QWEN-AUDIO快速部署&#xff1a;基于CUDA 12.1的RTX显卡兼容性验证 1. 这不是普通TTS&#xff0c;是能“呼吸”的语音系统 你有没有试过让AI说话时&#xff0c;不只是把字念出来&#xff0c;而是真的听得出情绪&#xff1f;比如一句“我好累”&#xff0c;可以是疲惫的叹息&a…

作者头像 李华