我很困惑我有几个家庭作业问题...... 您可以使用return()从函数返回多个数据项吗?一个函数只能返回一个值,除非它是一个指向数组的指针吗?
我认为答案是函数可以通过返回结构返回多个数据项。然后,返回指向数组的指针不是唯一的方法 - 如果这是一种方式?
但似乎有很多关于这个主题的讨论,所以我想确保我至少有一个基本的想法是正确的:你可以使用结构但使用指针返回多个数据项(我不明白这个)将更有效地使用内存。这是对的吗?
答案 0 :(得分:7)
使用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)。
您可以使用结构返回多个数据项,但使用指针(我不明白这一点)将更有效地使用内存。这是对的吗?
真。但是当你使用指针时,它取决于你如何使用它。 当你动态分配它时,每个函数调用它都不会非常有效,你需要在使用后手动释放内存。当您使用全局数组/结构时,它将是高效的。但是当你多次调用函数时会给你带来麻烦。
答案 1 :(得分:4)
除了在这个帖子中已经说过的内容之外,在C ++ 11中你可以返回使用uniform initialization初始化的结构:
struct XYZ {
int x;
int y;
int z;
};
XYZ foo() {
return {1, 2, 3};
}
我个人更喜欢使用命名成员而不是元组返回结构,因为后者不为其成员提供名称。
答案 2 :(得分:1)
这是正确的。
然而,您可以通过添加通过引用传递的参数来“返回”多个项目,然后将多个结果写入它们。
答案 3 :(得分:1)
一个函数确实只能用return语句返回一个'thing'。然而,那个东西可以是一个指针(C&amp; C ++数组只是伪装的指针),一个引用(一个不能重命名或者数组索引的指针)或一个可以封装多个东西的对象。 p>
如果你返回一个结构,你会将整个结构传回去。如果返回指针或引用,则只返回结构的地址 - 所以最好不要在函数返回时返回超出范围的结构的引用或指针!这样做会调用未定义的行为,这很可能(但不总是)是一个分段错误。
答案 4 :(得分:0)
如果你想了解更多关于这个读数的图片,关于按值传递参数并通过引用传递,它也适用于返回参数。
如你所说:
您可以使用结构返回多个数据项,但使用指针(我不明白这一点)将更有效地使用内存。这是对的吗?
假设你有一些结构:
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
我希望现在更清楚了;)