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

作为一个程序员,我们经常会遇到这样的情况:

别人写的C++项目,需要我们来进行 "修改,或者增加功能"。

举个例子

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

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

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

1. 结构体返回

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

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

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

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

使用这个函数:

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

这样做的好处包括:

优势

清晰:每个返回值都有名字,一看就懂。

灵活:将来想加更多返回信息?只需往结构体里添加字段即可。

安全:类型安全,不用担心乱七八糟的类型转换问题。

缺点

麻烦:每次都要定义新的结构体,代码就会多出很多定义。

可能慢:返回复杂的结构体可能会有性能开销,虽然现代编译器通常会优化这一点。

2. 加参数返回

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

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

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

cpp 复制代码
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;
}

优点

效率:直接操作参数,可以避免不必要的数据拷贝。

简单:不需要额外定义结构体或类。

缺点

可读性差:函数的用途和行为可能一眼看不出来。

难以维护:随着时间的推移,一个函数的参数可能越来越多,代码越来越难读。

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

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

性能优先:尤其是对于性能敏感的应用,这种方式能有效减少数据拷贝。

保持一致:如果项目中已经有很多这样的函数,继续这么做可以保持代码的风格一致。

快速开发:这种方式通常可以快速添加新功能,不需要大改现有代码。

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

相关推荐
汉克老师11 小时前
CSP-J 2026 第二轮入门组真题解析(第一题 、旅游)
c++·csp-j·信息学竞赛·小学生学c++
xiaoye-duck12 小时前
《C++ 项目:手写大模型接入 SDK》Gemini接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型
nice_lcj52014 小时前
Java Lambda 表达式入门:怎么写、怎么用、常用方法有哪些
java·开发语言·后端·面试
码农小河6615 小时前
基于SSM+JSP+MySQL的在线医疗服务系统的设计与实现
java·开发语言·mysql
UIU11416 小时前
P1481 魔族密码
c++·算法·动态规划
nice_lcj52019 小时前
ThreadLocal 入门:它是怎么隔离数据的、为什么会导致内存泄漏
java·开发语言·后端·面试·并发编程·内存泄漏·threadlocal
紧跟先前的步伐19 小时前
Go AI Agent 实战 28|Agent 的预算、超时与停止条件
开发语言·人工智能·后端·ai·golang
bksczm20 小时前
InnoDB 行格式详解:DYNAMIC / COMPACT / COMPRESSED / REDUNDANT
java·开发语言·数据库
春涧草茶20 小时前
慢就是快16-1协程
开发语言·前端·python
Dovis(誓平步青云)21 小时前
启元 T1 Pro 人机相声搭档:语音-触摸双通道的启元机器人节奏引擎设计
开发语言·前端·javascript·microsoft·交互