c ++从函数返回类型

时间:2016-01-13 18:38:54

标签: c++ arrays

在这个例子中,我想要返回int nums[40]
我该怎么做?

<RETURNTYPE> test()
{
    int nums[40];

    for (int i=0; i < 40; i++)
    {
        nums[i] = i + 1;
    }

    return nums;
}

3 个答案:

答案 0 :(得分:5)

你不能这样做。由于多种原因(包括历史记录和C兼容性,以及在几个重要情况下将数组衰减到指针的规则),您无法返回原始数组;但是你可以返回包含该数组的struct(或class ....)。

你在C ++ 11中可以做的是返回std::array<int,40>;它表现得像你的东西,但它是一个合适的类(你想象的所有常用操作,以及迭代器的东西)。所以你的代码变成了:

std::array<int,40> test(void) {
  std::array<int,40> nums;
  for (int i=0; i < 40; i++) {
    nums[i] = i + 1;
  }
  return nums;
}

optimizing compiler(例如g++ -Wall -O2 -std=c++11 ....使用最近的GCC)将优化与您的假设返回类型完全相同(或类似FISOCPP's answer,这很可能编译成相同的目标代码)。

如果大小(40)在运行时可能会有所不同,请使用std::vector<int>作为类型并声明std::vector> nums{40}; - 然后您可以nums.resize(17);然后数据将保留在堆中(所以性能损失很小。)

答案 1 :(得分:2)

唯一的方法是将数组封装到一个结构(或者union - 这是不相关的)中。

typedef struct { int ra[20]; } rvtyp;

rvtyp test()
{
    int nums[40];

    for (int i=0; i < 40; i++)
    {
        nums[i] = i + 1;
    }

    return *(rvtyp*)&nums;
}

然后您可以通过'test()。ra'。

访问您返回的值

答案 2 :(得分:0)

您需要动态分配内存(现在它在堆栈中)。返回类型将是int * then。