关于返回引用的一个问题?

来源:百度知道 编辑:UC知道 时间:2024/05/16 11:54:13
// 1.cpp /////////////
#include <iostream>
using namespace std;
int &get(int *array,int index)
{
return array[index];
}
void main()
{
int a[10];
for(int i=0;i!=10;++i)
{
get(a,i)=0;
cout<<a[i]<<endl;
}
}

// 2.cpp /////////
#include <iostream>
using namespace std;
int &get(int (&array)[10],int index)
{
return array[index];
}
void main()
{
int a[10];
for(int i=0;i!=10;++i)
{
get(a,i)=0;
cout<<a[i]<<endl;
}
}
在1.cpp里,get函数中返回的值array[index]应该算是一个局部对象吧?那这里返回一个局部对象的引用应该会有问题。我觉得是否写成2.cpp更加合适一些,即型参也是数组的引用,返回这样的引用应该没问题。
但是,在vc里运行1.cpp和2.cpp运行的结果是一样的,这是为什么呢?

首先,你函数get中不论是用引用还是指针,对这个参数都没有建立副本。而且,你不可能直接去建立数组的副本,你把参数表写成(int a[5])实际上a也会被转换成int a*,就是绝不建立原数组的副本。除非你自己在get中new一个,然后通过这个指针或引用来逐个复制,才能达到这个目的。
正因为这样,你所指向和引用的数组的作用域,实际是main中建立的,所以你可以安全返回。你返回用构造函数建立的临时对象也可以,如果你返回的不是指针和引用类型,那么你随便返回一个不是引用也不是指针的(数组不行,不允许返回数组)对象也可以,它会自动复制。
只有你返回的是指针或引用时,你必须保证你所引用或指向的对象的作用域,不在函数内,就没有危险。

int &get(int *array,int index)
{
return array[index];
}
这里,因为array是指针,所以array是局部变量,array[index]却不是局部变量

指针和引用都可以,在这里用指针明显更简洁。