【函数修改的重要问题】想要增加C++函数返回值,选择结构体?OR 额外参数?

作为一个程序员,我们经常会遇到这样的情况:
别人写的C++项目,需要我们来进行 ”修改,或者增加功能“。
在这里插入图片描述

举个例子

我们需要对于一个已有的C++函数,增加它的返回值信息,通常有两条路可走:

  1. 用结构体打包返回值
  2. 往函数里加参数

到底怎么选择呢?哪个更好呢?

1. 结构体返回

举个例子,当你有一堆相关的数据需要一起从一个函数返回出去。打个比方,一个函数要返回一个学生的姓名、成绩和班级。用结构体把这些信息打包起来返回就很直观。

//定义一个结构体来包含学生的姓名、成绩和班级
struct StudentInfo {
    std::string name;
    int grade;
    std::string className;
};

然后,我们创建一个函数,使用这个结构体返回学生信息:

StudentInfo getStudentInfo() {
    StudentInfo info;
    info.name = "John Doe";
    info.grade = 90;
    info.className = "Math 101";
    return info;
}

使用这个函数:

int main() {
    StudentInfo student = getStudentInfo();
    std::cout << "Name: " << student.name << ", Grade: " << student.grade << ", Class: " << student.className << std::endl;
    return 0;
}

这样做的好处包括:

优势

清晰:每个返回值都有名字,一看就懂。
灵活:将来想加更多返回信息?只需往结构体里添加字段即可。
安全:类型安全,不用担心乱七八糟的类型转换问题。

缺点

麻烦:每次都要定义新的结构体,代码就会多出很多定义。
可能慢:返回复杂的结构体可能会有性能开销,虽然现代编译器通常会优化这一点。

2. 加参数返回

另一种方法是给函数加上引用或指针参数,直接修改它们来返回额外的信息。

void getStudentInfo(std::string& name, int& grade, std::string& className) {
    name = "John Doe";
    grade = 90;
    className = "Math 101";
}

在主函数中调用这个函数时,我们需要提前声明变量来存储返回的数据:

int main() {
    std::string name;
    int grade;
    std::string className;
    getStudentInfo(name, grade, className);
    std::cout << "Name: " << name << ", Grade: " << grade << ", Class: " << className << std::endl;
    return 0;
}

优点

效率:直接操作参数,可以避免不必要的数据拷贝。
简单:不需要额外定义结构体或类。

缺点

可读性差:函数的用途和行为可能一眼看不出来。
难以维护:随着时间的推移,一个函数的参数可能越来越多,代码越来越难读。

为什么有的团队偏爱加参数?

很多时候,比如说,我们团队会倾向于通过加参数的方式来扩展函数的返回值,主要是因为:

性能优先:尤其是对于性能敏感的应用,这种方式能有效减少数据拷贝。
保持一致:如果项目中已经有很多这样的函数,继续这么做可以保持代码的风格一致。
快速开发:这种方式通常可以快速添加新功能,不需要大改现有代码。

最后,弱弱问一下,你的公司 是习惯用 结构体 还是 加参数?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/495302.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ROS2从入门到精通0-4:ROS2核心架构与常用指令大全

目录 0 专栏介绍1 ROS2核心架构1.1 工作空间1.2 功能包 2 ROS2常用指令2.1 功能包相关2.2 节点运行相关2.3 话题相关2.4 参数相关2.4 录制包、播放包相关2.5 服务相关2.6 动作相关2.7 生命周期相关 0 专栏介绍 本专栏旨在通过对ROS2的系统学习&#xff0c;掌握ROS2底层基本分布…

农村分散式生活污水分质处理及循环利用技术指南

标准已完成意见征集&#xff1a; 本文件给出了农村分散式生活污水分质处理及循环利用的总则、污水收集、污水分质处理、资源化利用、利用模式、运维管理等的指导。 本文件适用于农村分散式生活污水分质处理及循环利用的设施新建、扩建和改建工程的设计、施工与运维。 注:本文件…

AndroidStudio中一些实用插件

1.RainbowBrackets插件为圆括号、方括号和花括号内的代码添加了漂亮的彩虹色 2.CodeGlance类似于Sublime或Xcode&#xff0c;CodeGlance插件在编辑器中嵌入了代码迷你图。滚动条也有所增大。在CodeGlance预览文件的代码模式下&#xff0c;用户可以快速导航到目标处。 3.ADBWifi…

【数据分析面试】2.连续访问最长天数用户(SQL)

题目 给定一个包含事件日志的表格&#xff0c;找出连续访问平台时间最长的前五个用户。 注意&#xff1a;连续访问是指用户在连续的几天内每天至少访问一次平台。 示例&#xff1a; 输入&#xff1a; events 表 ColumnTypeuser_idINTEGERcreated_atDATETIMEurlVARCHAR 输…

第115讲:Mycat核心配置文件各项参数的作用以及概念

文章目录 1.Mycat配置文件相关概念2.Schema配置文件3.Rule配置文件4.Server配置文件 1.Mycat配置文件相关概念 在Mycat中核心的配置文件有schema.xml和rule.xml以及server.xml三个&#xff0c;其中schema.xml是用来配置数据库、表、读写分离、分片节点、分片规则等信息&#x…

transformers的tokenizer总结

1.BPE&#xff08;byte-pair encoding) 根据字母搭配出现的频率组成词根。 初始vocabulary&#xff1a;["b", "g", "h", "n", "p", "s", "u"] 假设训练数据中有10个hug,5个pug,12个pun&#xff0c;4…

教育数字化调研团走进锐捷,共议职业教育数字化转型新思路

为贯彻落实国家教育数字化战略行动部署和2024年全国教育工作会议精神,加快推进职业教育数字化转型与发展,梳理职业教育数字化转型的现状、问题及发展趋势,并总结展示职业教育数字化转型的好经验、好做法,培育职业教育数字化创新成果,推动数字技术与职业教育深度融合、提高数字化…

学习JavaEE的日子 Day32 线程池 上

Day32 线程池 1.引入 一个线程完成一项任务所需时间为&#xff1a; 创建线程时间 - Time1线程中执行任务的时间 - Time2销毁线程时间 - Time3 2.为什么需要线程池(重要) 线程池技术正是关注如何缩短或调整Time1和Time3的时间&#xff0c;从而提高程序的性能。项目中可以把Time…

PostgreSQL关系型数据库介绍与部署

使用背景 在过去的几年中&#xff0c;PostgreSQL的使用量逐渐增加&#xff0c;而Oracle和MySQL的使用量则有所下降。这主要是由于以下几个原因&#xff1a;开源和免费、功能丰富、可扩展性强、安全性高、跨平台支持好、社区活跃、成熟稳定。这些因素使得PostgreSQL成为了许多开…

2014年认证杯SPSSPRO杯数学建模A题(第二阶段)轮胎的花纹全过程文档及程序

2014年认证杯SPSSPRO杯数学建模 A题 轮胎的花纹 原题再现&#xff1a; 轮胎被广泛使用在多种陆地交通工具上。根据性能的需要&#xff0c;轮胎表面常会加工出不同形状的花纹。在设计轮胎时&#xff0c;往往要针对其使用环境&#xff0c;设计出相应的花纹形状。   第二阶段问…

深度学习语义分割篇——DeepLabV1原理详解篇

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;专栏推荐&#xff1a;深度学习网络原理与实战 &#x1f34a;近期目标&#xff1a;写好专栏的每一篇文章 &#x1f34a;支持小苏&#xff1a;点赞&#x1f44d;&#x1f3fc;、…

UMEDITOR – 支持WORD上传的富文本编辑器

1.下载代码 https://gitee.com/xproer/zyoffice-umeditor1x 2.引入组件 3.配置接口 效果

使用yolov9来实现人体姿态识别估计(定位图像或视频中人体的关键部位)教程+代码

yolov9人体姿态识别&#xff1a; 相较于之前的YOLO版本&#xff0c;YOLOv9可能会进一步提升处理速度和精度&#xff0c;特别是在姿态估计场景中&#xff0c;通过改进网络结构、利用更高效的特征提取器以及优化损失函数等手段来提升对复杂人体姿态变化的捕捉能力。由于YOLOv9的…

出口落叶就能获取暴利,他却要断了这条财路!学会人生算法重启装置应用!——早读(逆天打工人爬取热门微信文章解读)

重启装置的应用&#xff0c;你学会了吗&#xff1f; 引言Python 代码第一篇 人民日报 出口落叶就能获取暴利&#xff0c;他却要断了这条财路&#xff01;第二篇 人民日报 来啦 早班车新闻要闻社会政策 结尾 昨日之覆辙 非明日之方向 泰戈尔曾言 你不能拽着自己的头发离开地面 因…

电商企业如何用数据打造破局利器:电商API数据采集实时接口助力企业618双十一各大活动

在电商行业中&#xff0c;618大促无疑是一场引爆商机的盛宴。 随着市场环境的变更&#xff0c;如何在这样高强度的活动期间脱颖而出&#xff0c;成为每个品牌都需要面对的重要问题。 大促期间&#xff0c;实时、准确的数据是核心竞争力。因为在大促中&#xff0c;核心渠道、核…

HBase的Python API(happybase)操作

一、Windows下安装Python库&#xff1a;happybase pip install happybase -i https://pypi.tuna.tsinghua.edu.cn/simple 二、 开启HBase的Thrift服务 想要使用Python API连接HBase&#xff0c;需要开启HBase的Thrift服务。所以&#xff0c;在Linux服务器上&#xff0c;执行如…

PCL 彩色点云RGB转灰度并显示

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、原理概述 不同要素之间的灰度差异较为明显。点云灰度值与RGB属性的关系为:

Mysql数据库:高级SQL语言详解

目录 前言 一、按关键字排序查询 1、单字段排序 1.1 按某一字段升序排序 1.2 按某一字段降序排序 1.3 结合where进行条件进行排序 2、多字段排序 2.1 按多字段升序排序 2.2 按多字段降序排序 2.3 案例操作 3、区间判断及查询不重复记录 3.1 区间判断 3.1.1 AND/OR…

【数据结构】链表习题之反转链表和删除链表中等于给定值 val 的所有节点

&#x1f451;个人主页&#xff1a;啊Q闻 &#x1f387;收录专栏&#xff1a;《数据结构》 &#x1f389;道阻且长&#xff0c;行则将至 前言 今天的博客是关于链表的题目&#xff0c;力扣上的题目之反转链表和删除链表中等于给定值 val 的所有节点 一.反转…

PMP考试难不难,通过率怎样?

PMP考试自从新考纲调整后有几次考试难度是非常高的&#xff0c;那段时间我也看网上好多机构通过率都不咋地&#xff0c;当时也是因为官方的出题难度稍高&#xff0c;还组织了免费的重考&#xff0c;也是后来逐渐开始归于平常了吧&#xff0c;直到现在都是我认为比较简单的选择题…