[英]Returning multiple data items from a function in C or C++
我对我的几个作业问题感到困惑...你能使用return()从函数中返回多个数据项吗? 一个函数只能返回一个值,除非它是一个指向数组的指针吗?
我相信答案是函数可以通过返回结构返回多个数据项。 然后,返回指向数组的指针不是唯一的方法 - 如果这是一种方式?
但似乎有很多关于这个主题的讨论,所以我想确保我至少有基本的想法是正确的:你可以使用结构返回多个数据项但使用指针(我不明白)会使用记忆更有效率。 它是否正确?
使用C ++ 0x / C ++ 11,您可以使用:
#include <string>
#include <iostream>
#include <tuple>
using namespace std;
tuple<int, unsigned, string, int> getValues()
{
return tuple<int, unsigned, string, int>(1, 2, "3", 4);
}
int main()
{
int a;
unsigned b;
string c;
int d;
tie(a, b, c, d) = getValues();
cout << a << ", " << b << ", " << c << ", " << d << endl;
return 0;
}
用它编译
g++ tuple_test.cpp -std=c++0x -o tuple_test
并且,如果您运行该程序,它将输出:
1, 2, 3, 4
但是最好使用像这样的引用(我想说):
void getValues(int& a, unsigned& b, string& c, int& d)
{
a = 1;
b = 2;
c = "3";
d = 4;
}
int main()
{
...
getValues(a, b, c, d)
...
}
这就是我没有仔细阅读的问题。
一个函数只能返回一个值,除非它是一个指向数组的指针吗?
是的,你只能返回1个单值,但是这个单值可以包含乘法值(struct,class,array)。
您可以使用结构返回多个数据项,但使用指针(我不明白这一点)将更有效地使用内存。 它是否正确?
真正。 但是当你使用指针时,它取决于你如何使用它。 当你动态分配它时,每个函数调用它都不会非常有效,你需要在使用后手动释放内存。 当您使用全局数组/结构时,它将是高效的。 但是当你多次调用函数时会给你带来问题。
除了在这个线程中已经说过的内容之外,在C ++ 11中你可以返回使用统一初始化初始化的结构:
struct XYZ {
int x;
int y;
int z;
};
XYZ foo() {
return {1, 2, 3};
}
我个人更喜欢返回带有命名成员而不是元组的结构,因为后者不为其成员提供名称。
那是正确的。
但是,您可以通过添加通过引用传递的参数来“返回”多个项目,然后将多个结果写入它们。
一个函数确实只能用return语句返回一个'thing'。 然而,那个东西可以是一个指针(C&C ++数组只是伪装的指针),一个引用(一个不能重命名或者数组索引的指针)或一个可以封装多个东西的对象。
如果你返回一个结构,你就会将整个结构传回去。 如果返回指针或引用,则只返回结构的地址 - 所以最好不要在函数返回时返回超出范围的结构的引用或指针! 这样做会调用未定义的行为,这很可能(但并非总是)是一个分段错误。
如果您想要了解有关此读数的更大图片,请按值传递参数并通过引用传递,它也适用于返回参数。
如你所说:
您可以使用结构返回多个数据项,但使用指针(我不明白这一点)将更有效地使用内存。 它是否正确?
让我们说你有一些结构:
struct BigStructure{
int array[1000];
double otherData[1000];
//... etc
};
和一些方法:
BigStructure workWhenCopying(BigStructure bigStruct){
// some work with a structure
return bigStruct;
}
此方法说明了将参数传递给方法并按值返回时的情况,这意味着每次调用此方法时,都会将方法的参数复制到内存中的其他位置。 这种复制需要时间,当你有更大的结构时,它会减慢你的程序运行时间,因此通过引用传递大型结构会更有效。
void workWithReference(BigStructure & bigStruct){
// do some work
}
在这种情况下,您不是复制整个数据结构,只是传递此结构所在的内存地址。 您也不需要返回语句,因为在此方法之外可以看到对该结构对象的更改。 但是,如果您将bigStruct重新分配给新的内存位置,它将仅在本地方法中可见: workWithReference
我希望现在更清楚了;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.