news 2026/4/22 15:28:57

c++函数传参的几种推荐方式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
c++函数传参的几种推荐方式

比如一个func函数,需要传入一个T类型的很大的x参数用于func内部读取(不修改)。有几种方法:

方法一:值传递

这也是最简单的方法:

void func(T x) { T y = x; // x到y有拷贝 T y = std::move(x); // x所有权交给y,没有拷贝,但后文不能再用x了 }

调用:

T a; func(a); // a到x有1次拷贝

由于是值传递,这里a到x需要一次拷贝,x到y如果不用std::move的话又有一次拷贝。

如果不想要a到x的值传递时的拷贝,需要在调用时move:

T a; func(std::move(a)); // a到x有0次拷贝,1次move构造(move比较轻量) //这里把a完全交给了func内部,没有拷贝,但后文不能再用a了

结论:

  • 接口最灵活

  • 调用方决定是否拷贝(选择是否std::move(a)),这是 STL 和 Effective Modern C++ 强烈推荐的模式

  • 现代 C++ 非常推荐(“pass-by-value + move”惯用法)

方法二:引用传递(只读参数最佳)

类似于c语言的传递指针(不利于对象管理,此处不讨论),但是c++中有一个引用传递的新概念:

void func(const T& x) { T y = x; // x到y有拷贝 }

调用:

T a; func(a); // x就是a的引用,0次拷贝,0次move构造

这里T&表示传入的就是a的引用,不存在a到x的拷贝过程。const表示传入的x在函数内部不准修改,保证了a不会被func修改掉(func只读a)。

但是const T&不能实现a到y的完全无拷贝传递,一个经典的错误:

void func(const T& x) { // 假的move,实际还是发生了拷贝,因为move的是const T&类型,而不是x的所有权 T y = std::move(x); }

结论:

  • 最佳适用场景

    • 只读

    • 不接管所有权

    • 不需要在函数内部生成新对象

  • 不要指望它“零拷贝生成 y”

方法三:传入右值(所有权传递)

针对const T&不能传入a的所有权从而无拷贝把a给到y的问题,实际应当传入a的右值。

有两种方法:

1. 方法一种提到的值传递,函数调用一次move把a给到x,函数内部用move再把x给到y,全程0拷贝,2次move(推荐)

void func(T x) { y = std::move(x); //x到y 0次拷贝,1次move(轻量),后文不能再用x了 } //调用 T a; func(std::move(a)); // a到x 0次拷贝,1次move(轻量),后文不能再用a了

这相当于把是否拷贝的选择交给了调用方,调用方可以用func(a)也可以用func(std::move(a)),前者a到x有一次拷贝,后者没有但后文不能再用a了。

2. 强制只能传入右值,明确接管

void func(T&& x) { T y = std::move(x); // x到y有0次拷贝,1次move(轻量) } //调用 T a; func(std::move(a)); // a到x 0次拷贝,0次move,因为x不是新对象,已经绑定到a // func(a); //不允许

这里用T&&表示传入的只能是右值,减少了值传递a到x的move,但也限定了a后文不能再用。

结论:

  • 适合:

    • 明确“我就是要接管你的对象”,相比值传递写法可以少1次move。

    • 函数语义就是“消费型接口”

  • 不适合:

    • 公共 API

    • 希望调用方既能传左值又能传右值

所以:T&&是“语义最强,但最不灵活”的接口。

总结:

  • 只读 →const T&

  • 可能接管 →T(值传递或者std::move())

  • 强制接管 →T&&

  • 别对const T&std::move

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

科学方法提升记忆与思维能力

在现代社会,信息爆炸性增长,高效记忆与思维能力已成为个人发展的关键要素。许多人曾梦想过目不忘、一目十行的能力,但往往受限于传统学习方法的低效与不稳定。随着脑科学领域的进步,科学方法正逐步揭示大脑潜能的奥秘,…

作者头像 李华
网站建设 2026/4/19 6:11:35

LobeChat能否识别面部表情?情感反馈闭环

LobeChat能否识别面部表情?情感反馈闭环 在智能对话系统日益普及的今天,用户对AI助手的期待早已超越了“问一句答一句”的机械交互。我们希望它不只是聪明,更要有温度——能察觉我们的疲惫、理解我们的低落,甚至在我们微笑时回应以…

作者头像 李华
网站建设 2026/4/20 0:01:50

Simulink模型转.so实战:高效部署到Qt项目的操作指南

Simulink模型转.so实战:高效部署到Qt项目的操作指南1、背景1.1 方案对比1.2 方案选择2、实践操作2.1 创建单独的文件夹进行管理2.2 创建CMakelists2.3 编译输出so文件2.4 查看对应的so发布件2.5 windows平台生成lib2.6 Qt工程中适配.pro文件2.7 编译运行3、总结3.1 …

作者头像 李华
网站建设 2026/4/20 23:29:08

命令行ninja在鸿蒙PC上的使用方法

ohos-ninja 是为 OpenHarmony 平台编译的 ninja 构建工具。本文档详细介绍如何在鸿蒙PC上安装和使用官方适配完成的 ninja 工具,包括 HNP 包的打包、安装和使用方法。 📋 目录 一、项目概述二、为什么需要 HNP 包三、HNP 包打包方法四、安装与使用五、使…

作者头像 李华
网站建设 2026/4/16 18:30:47

LobeChat能否引用权威来源?知识准确性保障

LobeChat能否引用权威来源?知识准确性保障 在医疗、法律或金融等高风险场景中,一句没有出处的AI回答可能带来严重后果。当模型自信满满地给出一个看似合理却未经验证的说法时,用户如何判断它是否可信?这正是当前大语言模型&#x…

作者头像 李华
网站建设 2026/4/20 20:26:02

LobeChat能否部署在Vercel平台?Serverless极致简化方案

LobeChat能否部署在Vercel平台?Serverless极致简化方案 在AI应用快速普及的今天,越来越多开发者希望用最低成本、最快速度上线一个功能完整的聊天机器人界面。然而,传统部署方式往往意味着要买服务器、配Nginx、设反向代理、处理HTTPS证书——…

作者头像 李华