news 2026/5/2 3:36:15

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/23 12:36:35

EasyAnimateV5图生视频模型5分钟上手教程:从图片到6秒短视频

EasyAnimateV5图生视频模型5分钟上手教程&#xff1a;从图片到6秒短视频 [toc] 1. 你真的只需要5分钟&#xff0c;就能让静态图片动起来 你有没有过这样的时刻&#xff1a;拍了一张特别满意的照片&#xff0c;想发到社交平台&#xff0c;但总觉得静态图少了点什么&#xff1…

作者头像 李华
网站建设 2026/4/23 12:19:14

Sunshine:构建低延迟游戏串流的完整指南

Sunshine&#xff1a;构建低延迟游戏串流的完整指南 【免费下载链接】Sunshine Sunshine: Sunshine是一个自托管的游戏流媒体服务器&#xff0c;支持通过Moonlight在各种设备上进行低延迟的游戏串流。 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunsh…

作者头像 李华
网站建设 2026/5/1 8:09:53

ChatGLM3-6B-128K实战:用Ollama轻松处理128K超长文本

ChatGLM3-6B-128K实战&#xff1a;用Ollama轻松处理128K超长文本 1. 为什么你需要一个能“记住整本书”的AI&#xff1f; 你有没有遇到过这些场景&#xff1a; 看完一份50页的产品需求文档&#xff0c;想让AI帮你总结核心逻辑&#xff0c;结果刚输入一半就提示“超出上下文长…

作者头像 李华
网站建设 2026/4/23 10:45:39

SiameseUIE案例分享:如何自动提取合同关键信息

SiameseUIE案例分享&#xff1a;如何自动提取合同关键信息 在实际业务中&#xff0c;每天都有大量合同需要人工审阅——付款条款、违约责任、签约方信息、服务期限……这些关键字段分散在几十页文档中&#xff0c;靠人工逐字查找不仅耗时费力&#xff0c;还容易遗漏或出错。有…

作者头像 李华
网站建设 2026/5/1 5:15:44

5个超实用技巧:用AntiMicroX让手柄玩家彻底解决键盘模拟难题

5个超实用技巧&#xff1a;用AntiMicroX让手柄玩家彻底解决键盘模拟难题 【免费下载链接】antimicrox Graphical program used to map keyboard buttons and mouse controls to a gamepad. Useful for playing games with no gamepad support. 项目地址: https://gitcode.com…

作者头像 李华