news 2026/4/19 16:50:21

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/4/19 15:09:01

VibeVoice Pro作品分享:韩语kr-Spk1_man韩剧旁白风格语音生成集

VibeVoice Pro作品分享&#xff1a;韩语kr-Spk1_man韩剧旁白风格语音生成集 1. 为什么韩剧旁白听起来那么“上头”&#xff1f;这次我们用AI复刻了它 你有没有注意过&#xff0c;韩剧里的旁白总有一种特别的魔力——不是高声朗读&#xff0c;也不是机械念稿&#xff0c;而像一…

作者头像 李华
网站建设 2026/4/17 12:17:27

颠覆式智能游戏辅助:让《绝区零》玩家重获游戏乐趣

颠覆式智能游戏辅助&#xff1a;让《绝区零》玩家重获游戏乐趣 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZoneZero-OneDragon 在快节奏的现…

作者头像 李华
网站建设 2026/4/18 12:31:11

FLUX.1-dev创意应用:用AI为电商设计惊艳产品图

FLUX.1-dev创意应用&#xff1a;用AI为电商设计惊艳产品图 电商运营者每天面对一个现实困境&#xff1a;一张高质量主图&#xff0c;往往需要专业摄影师修图师美术指导协同工作&#xff0c;耗时2–4小时&#xff0c;成本数百元&#xff1b;而平台算法又对首屏点击率极度敏感—…

作者头像 李华
网站建设 2026/4/17 20:54:31

DeepSeek-OCR-2快速上手:Chrome/Firefox/Safari主流浏览器兼容性验证

DeepSeek-OCR-2快速上手&#xff1a;Chrome/Firefox/Safari主流浏览器兼容性验证 1. 工具概览 DeepSeek-OCR-2是一款基于AI模型的智能文档解析工具&#xff0c;它能将各种格式的文档&#xff08;包括扫描件、照片等&#xff09;精准转换为结构化的Markdown格式。与普通OCR工具…

作者头像 李华