C++ c++;函数的返回类型
在本例中,我希望返回C++ c++;函数的返回类型,c++,arrays,C++,Arrays,在本例中,我希望返回int nums[40] 我怎么做 <RETURNTYPE> test() { int nums[40]; for (int i=0; i < 40; i++) { nums[i] = i + 1; } return nums; } test() { int nums[40]; 对于(int i=0;i
int nums[40]
我怎么做
<RETURNTYPE> test()
{
int nums[40];
for (int i=0; i < 40; i++)
{
nums[i] = i + 1;
}
return nums;
}
test()
{
int nums[40];
对于(int i=0;i<40;i++)
{
nums[i]=i+1;
}
返回nums;
}
您需要动态分配内存(它现在在堆栈上)。返回类型将是int*那么。您不能这样做。由于一些原因(包括历史、C兼容性以及在一些重要情况下将数组衰减为指针的规则),您无法返回原始数组;但是您可以返回包含该数组的结构
(或类
…)
在C++11中可以做的是返回一个;它的行为与您的东西类似,但它是一个适当的类(包含您想象的所有常规操作,以及迭代器之类的东西)。因此,您的代码变成:
std::array<int,40> test(void) {
std::array<int,40> nums;
for (int i=0; i < 40; i++) {
nums[i] = i + 1;
}
return nums;
}
std::数组测试(无效){
std::数组nums;
对于(int i=0;i<40;i++){
nums[i]=i+1;
}
返回nums;
}
一个(例如,g++-Wall-O2-std=c++11
…使用一个最近的)将与您假设的返回类型(或类似的,可能被编译成相同的目标代码)完全相同地优化它
如果大小(40)在运行时可能不同,则使用std::vector
作为类型并声明std::vector>nums{40}代码>-然后您可以nums.resize(17)然后,数据将留在堆中(因此会有很小的性能损失)。实现这一点的唯一方法是将数组封装到一个结构中(或联合,这与此无关)
typedef结构{int ra[20];}rvtyp;
rvtyp试验()
{
int nums[40];
对于(int i=0;i<40;i++)
{
nums[i]=i+1;
}
返回*(rvtyp*)和nums;
}
然后,您可以通过“test().ra”访问返回值。另请参见:为什么不使用std::vector
而不是数组?std::vector可以,但我希望在示例中使用int[]
。您可以随时在需要时使用。Imho最佳实践是仅在需要时转换它,因此即使客户端代码需要一个int[]
我也会在函数中使用一个向量。之后我必须释放吗?我的意思是它是堆还是堆?它是“斯蒂克”。每个变量大概都存储在那里(具体信息请参考ISO标准)。但是,您可以有一个指向非堆栈内存的指针(通常通过调用函数来提供)。在我们的例子中,我们没有返回指针,也没有调用外部函数,因此可以假设它是堆栈。因此,调用函数不需要外部工作。这不是真的-我正在将局部变量'nums'复制到返回值。就我所知,没有未定义的行为。我返回的是整个数组,而不是指向它的指针。如果你编辑你的答案,我将能够对它进行投票。我错误地否决了它!
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;
}