从C或C ++中的函数返回多个数据项

时间:2011-10-02 05:28:15

标签: c++ return structure

我很困惑我有几个家庭作业问题...... 您可以使用return()从函数返回多个数据项吗?一个函数只能返回一个值,除非它是一个指向数组的指针吗?

我认为答案是函数可以通过返回结构返回多个数据项。然后,返回指向数组的指针不是唯一的方法 - 如果这是一种方式?

但似乎有很多关于这个主题的讨论,所以我想确保我至少有一个基本的想法是正确的:你可以使用结构但使用指针返回多个数据项(我不明白这个)将更有效地使用内存。这是对的吗?

5 个答案:

答案 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

我希望现在更清楚了;)