一篇带你理解掌握C++返回多变量的4种技巧
C++中实现函数返回多个变量的4种方法:1. 结构体/类封装:定义包含多个成员的结构体,返回结构体对象;2. 引用参数:通过引用参数直接修改外部变量;3. std::pair/tuple:使用标准库提供的模板类打包返回值;4. 容器存储:用vector等容器返回相同类型变量(不推荐)。每种方法各有特点,结构体适合复杂数据,引用参数直接高效,pair/tuple简洁方便,开发者可根据场景选择最佳方案
提到 return 语句,多数人第一反应是 “一次只能返回一个变量”—— 这确实是 C++ 的语法规则。但实际开发中,我们总会遇到需要 “打包返回” 多个值的场景:比如计算两个数的和与积、解析字符串后同时返回结果和状态、查询数据时同时返回结果集与总数……
此时,“只能返回一个变量” 的限制似乎成了阻碍。但别急,C++ 早就为我们准备了多种优雅的解决方案。从最直观的结构体封装,到标准库提供的 pair/tuple,再到通过引用参数 “输出” 结果,每种方法都有其适用场景。今天这篇文章,我们就来系统梳理这些方法,带你彻底掌握 C++ 中返回多变量的技巧。
1.结构体或者类封装返回多变量
我们可以在结构体或者类中创建多个成员变量然后创建对象最后返回对象,这样就实现了返回多变量
使用结构体举例说明
#include <iostream>
#include <string>
using namespace std;
// 定义结构体封装多个返回值
struct Result {
int sum; // 和
int product; // 积
string info; // 附加信息
};
// 函数返回结构体
Result calculate(int a, int b) {
Result res;
res.sum = a + b;
res.product = a * b;
res.info = "计算完成";
return res;
}
int main() {
auto result = calculate(3, 5);
cout << "和: " << result.sum << endl;
cout << "积: " << result.product << endl;
cout << "信息: " << result.info << endl;
return 0;
}
2.引用参数返回多变量
在 C++ 中,引用(&)是一种特殊的语法 —— 它允许我们为变量创建一个 “别名”,对引用的操作会直接作用于原变量。这一特性让引用成为传递 “输出参数” 的理想选择:通过将需要返回的变量以引用形式传入函数,函数内部对引用的修改会直接反映到外部变量上,从而实现 “一次函数调用返回多个值” 的效果。
博主对引用的通俗理解: 引用其实就是变形的指针而指针表示的就是地址,那我们将一个参数的地址传到函数中,函数直接修改该地址中的值,我们原函数中参数值是不是也就改变了.
指针类型
#include<iostream>
void test(int* a ,int* b) {
//这里是改变a b地址中的值
*a = 3;
*b = 4;
}
int main() {
//分配内存
int* a = new int;
int* b = new int;
*a = 1;
*b = 2;
//那么这里的a和b都是地址 *a表示的a地址的值
test(a,b);
std::cout << *a << "," << *b << std::endl; // 打印结果 3,4
std::cin.get();
}
引用类型 : 用引用简写上面代码
#include<iostream>
void test(int& a ,int& b) {
a = 3;
b = 4;
}
int main() {
//分配内存
//int* a = new int;
//int* b = new int;
//*a = 1;
//*b = 2;
int a = 1, b = 2;
test(a,b);
std::cout << a << "," << b << std::endl; // 打印结果 3,4
std::cin.get();
}
用一个通俗的例子类比:
普通参数传递像 “快递”:你把包裹(变量值)交给函数,函数处理后只能寄回一个新包裹(
return的值)。引用参数传递像 “钥匙”:你把家门钥匙(引用)交给函数,函数可以直接进你家修改物品(外部变量),无需 “寄回” 就能完成多件物品的更新
如果还是不理解,博主在这里真心建议去b站或者csdn上查取引用概念,理解引用 下面的代码一看就会,一看就理解.
#include <iostream>
using namespace std;
// 函数功能:计算a和b的和与积,通过引用参数sum和product返回
void calculate(int a, int b, int& sum, int& product) {
sum = a + b; // 直接修改外部sum变量
product = a * b; // 直接修改外部product变量
}
int main() {
int x = 3, y = 5;
int s, p; // 提前定义用于接收结果的变量
// 调用函数时,将s和p以引用形式传入
calculate(x, y, s, p);
// 函数执行后,s和p已被修改
cout << "和:" << s << ",积:" << p << endl; // 输出:和:8,积:15
return 0;
}
3.使用 std::pair 或 std::tuple(C++11+)返回多变量
std::pair 或 std::tuple是C++官方给我提供的方法,我们直接学习理解即可(他们的底层实现可以简单理解为使用结构体实现).
底层简单如下
template <typename T1, typename T2>
struct pair {
// 两个成员变量,分别存储第一个和第二个元素
T1 first; // 第一个元素
T2 second; // 第二个元素
// 构造函数:初始化first和second
pair(const T1& a, const T2& b) : first(a), second(b) {}
// 支持移动构造(C++11)
pair(T1&& a, T2&& b) : first(std::move(a)), second(std::move(b)) {}
// 其他构造函数(如默认构造、拷贝构造等)
};
他们的返回多变量代码如下:
#include <iostream>
#include <utility> // for std::pair
#include <tuple> // for std::tuple
using namespace std;
// 返回两个值:使用pair
pair<int, int> getSumAndProduct(int a, int b) {
return {a + b, a * b}; // C++11起支持列表初始化
}
// 返回三个值:使用tuple
tuple<int, int, string> getMoreInfo(int a, int b) {
return {a + b, a * b, "计算完成"};
}
int main() {
// 处理pair
auto [sum, product] = getSumAndProduct(3, 5); // C++17结构化绑定
cout << "和: " << sum << ", 积: " << product << endl;
// 处理tuple
auto [s, p, info] = getMoreInfo(3, 5);
cout << "和: " << s << ", 积: " << p << ", 信息: " << info << endl;
// C++17前的访问方式
auto result = getSumAndProduct(3, 5);
cout << "和: " << result.first << ", 积: " << result.second << endl;
return 0;
}
4. 使用容器(如 std::vector、std::array)返回多变量
这种事最不推荐的,因为我们根本不知道 0 / 1 / 2 .... 每个索引位置上的值代表的是什么.
演示代码如下:
#include <iostream>
#include <vector>
using namespace std;
// 返回多个相同类型的值
vector<int> getMultiples(int base, int count) {
vector<int> result;
for (int i = 1; i <= count; ++i) {
result.push_back(base * i);
}
return result;
}
int main() {
auto multiples = getMultiples(3, 5); // 3,6,9,12,15
for (int num : multiples) {
cout << num << " ";
}
return 0;
}
更多推荐


所有评论(0)