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

C++ 从C或C+中的函数返回多个数据项+;,c++,return,structure,C++,Return,Structure,我对一些家庭作业问题感到困惑。。。 可以使用return()从函数返回多个数据项吗?函数只能返回一个值,除非它是指向数组的指针 我相信答案是,一个函数可以通过返回一个结构来返回多个数据项。那么,返回指向数组的指针不是唯一的方法——如果这是一种方法的话 但是关于这个主题似乎有很多讨论,所以我想确保我至少有一个正确的基本想法:可以使用一个结构返回多个数据项,但是使用指针(我不理解这一点)将更有效地使用内存。这是正确的吗?这是正确的 但是,您可以通过添加通过引用传递的参数来“返回”多个项,然后将多个结

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

我相信答案是,一个函数可以通过返回一个结构来返回多个数据项。那么,返回指向数组的指针不是唯一的方法——如果这是一种方法的话

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

这是正确的


但是,您可以通过添加通过引用传递的参数来“返回”多个项,然后将多个结果写入其中。

函数实际上只能通过其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
}
在这种情况下,您不是复制整个数据结构,而是传递该结构所在的内存地址。您也不需要return语句,因为对该结构对象的更改在该方法之外是可见的。但是,如果将bigStruct重新分配到一个新的内存位置,它将仅在本地方法中可见:
workWithReference


我希望现在更清楚;)

对于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;
}
如果运行该程序,它将输出以下内容:

1, 2, 3, 4
但最好使用这样的引用(我会说):

这就是我没有仔细阅读问题的原因

函数只能返回一个值,除非它是指向数组的指针

是的,您只能返回1个单一值,但这个单一值可以包括多个值(结构、类、数组)

您可以使用一个结构返回多个数据项,但使用指针(我不理解这一点)将更有效地使用内存。这是正确的吗

对。但当你使用指针时,这取决于你如何使用它。
当您在每个函数调用中动态分配内存时,它的效率不会很高,您需要在使用后手动释放内存。当您使用全局数组/结构时,它将是高效的。但在多次调用函数时可能会出现问题。

除了本线程中已经说过的内容外,在C++11中,还可以使用以下方法返回初始化的结构:


就我个人而言,我更喜欢返回带有命名成员的结构,而不是元组,因为元组不为其成员提供名称。

有趣的是,虽然函数只能正确返回一件事,但它可以a)修改许多事,b)一件事可以包含许多事(结构/元组)。因此,技术上的答案是肯定的,但大多数情况下,答案是否定的。事实是,虽然在返回整个结构时确实会将其传递回去,但由于编译器优化,复制不会发生,只要所说的结构是在函数中创建的。你的workWithReference示例是误导性的,因为你不是通过引用而是通过指针传递的(其效果类似)。也没问题,仅供参考,我可以随意编辑你的文章以提高质量。通常这样做可以为你赢得更多的选票。。。
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)
    ...
}
struct XYZ {
    int x;
    int y;
    int z;
};

XYZ foo() {
    return {1, 2, 3};
}