结构体返回多个值的本质是将多值打包为复合类型,需轻量、命名清晰、构造明确;应避免空结构体、缺构造函数及大对象深拷贝,推荐直接返回对象并善用结构化绑定。

用结构体返回多个值的核心逻辑
结构体本身不是“返回多个值”的语法糖,而是把多个值打包成一个复合类型再返回——C++ 不支持原生多返回值,所以这是最直接、最可控的方式。
关键在于:结构体要轻量(避免深拷贝)、成员命名清晰、构造方式明确。别为了“看起来像返回多个值”而忽略可维护性。
定义结构体时要注意的三件事
常见错误是定义空结构体、不加构造函数、或成员类型选错,导致调用方必须手动赋值或出现隐式转换问题。
-
struct成员尽量用public,避免 getter/setter 增加冗余 - 提供默认构造函数和成员初始化列表,防止未定义行为(尤其含
std::string或指针时) - 避免在结构体里放大对象(如
std::vector大数组),否则返回时可能触发深拷贝;改用const std::vector<t>&</t>引用参数传入,或返回std::tuple(见下条)
示例:
struct ParseResult {
int code;
std::string message;
double value;
ParseResult(int c, const std::string& m, double v)
: code(c), message(m), value(v) {}
};
函数签名怎么写才不容易出错
返回结构体本身没问题,但要注意调用方是否需要移动语义、是否误用了引用返回。
- 直接返回结构体对象(推荐):
ParseResult parse_input(const std::string& s)—— C++17 起 guaranteed copy elision,无性能损失 - 不要返回局部结构体的引用:
const ParseResult& parse_input(...)是悬垂引用,运行时崩溃 - 如果结构体较大且调用方只读,可考虑
std::optional<parseresult></parseresult>表达可能失败,比用bool+ 输出参数更清晰
什么时候该换 std::tuple 或结构体指针
结构体适合有业务语义的组合(比如 Position{x,y,z}),tuple 适合临时、无名的多值打包(比如 std::make_tuple(42, "ok", 3.14))。
- 用
std::tuple的代价:无法通过名字访问字段,得靠std::get(t),易错且难读 - 返回
std::unique_ptr<mystruct></mystruct>是过度设计,除非结构体生命周期必须脱离函数栈(几乎不需要) - 如果只是临时拆包,C++17 结构化绑定很香:
auto [c, msg, v] = parse_input(s);—— 但这要求结构体是聚合类型(无用户定义构造函数、public 成员等)
结构化绑定限制多,不如老老实实写个带名结构体来得稳。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











