C++函数返回局部struct是否可行?如何修改可得到预期返回值?
结论
你给出的代码无法正常运行,存在三处明确的语法/逻辑错误,同时你对C++类/结构体返回值的认知存在偏差。
现有代码的问题
func函数缺少返回语句:你声明了func返回Somestruct值类型,但函数体中只初始化了局部变量RET,没有执行return RET;,属于未定义行为,多数编译器会直接抛出警告,运行时拿到的var值是随机的。- 成员访问语法错误:
Somestruct中的a是普通成员变量,不是成员函数,你在main中写的var.a()多了括号,直接访问var.a即可。 - 缺少必要头文件:使用
std::cout需要提前包含<iostream>头文件,否则编译直接失败。
认知纠正
C中struct和class只有默认成员访问权限的区别:struct默认public,class默认private,除此之外两者的行为完全一致。
你之前理解的「返回类时只会返回指针」是完全错误的:只要返回值声明的是类型本身(不是指针/引用),不管是class还是struct,都会执行值拷贝(C11及以后符合条件的情况下会优化为移动构造),返回完整的对象数据,不会返回栈内存指针。你之前用class实现失败肯定是代码逻辑写错,和类型是class还是struct无关。
修改后可正常运行的代码
#include <iostream> typedef struct _s{ int a; } Somestruct; Somestruct func(){ Somestruct RET; RET.a = 10; return RET; // 补充返回语句 } int main(){ Somestruct var = func(); std::cout << var.a; // 去掉成员访问的括号 return 0; }
运行后会输出你预期的10。
内容的提问来源于stack exchange,提问作者a276me
相关产品推荐
相关产品推荐

