1错2对,
引用类似于指针,其实是个地址类的变量。
函数中的局部变量其实是在调用栈上分配的,当函数返回时,调用栈中的数据还没被覆盖。
所以 int b=fun(); 是可接受的,因为在函数局部变量的数据还没被覆盖时,就通过引用把局部数据赋值给了b. (但这是个不推荐的东东,高手的游戏,初学者慎用)
int &a=fun(); 不可接受,是因为a记录的实质是个地址,且指向的是函数内的局部变量,这个变量是在调用栈上,很容易被覆盖,所以a往往不能有正确的值。
楼主的程序中调用的是同一函数,(且没调用其他的函数,所以引用a指向的地址中的值还是10,结果对),你可以试试下面的:
#include
using namespace std;
int& fun(){ int a=10; return a;}
int foo(){ int b=1,c=3,d=6; return 0;}
int main()
{
int &a=fun();
int b=fun(); //覆盖了引用a所指的内存,但值还是10
foo(); //覆盖了引用a所指的内存,值是1了
cout< cout< cin.get();
return 0;
}
这个引用有一些微妙,首先:fun()返回int型的引用就是大忌,因为在你返回后a这个局部变量已备摧毁了,不存在了,所以它现在的int &a=fun();处的引用还是指向fun函数中a的地址上(这里我是为了说的方便,引用不存在指针这一说法),所以它的值就错了,它指向一个为分配的内存处了。我改一下你的程序:
#include
using namespace std;
int& fun(int i){
int a=i;
return a;
}
int main(){
int &a=fun(10);
int b=fun(20);
cout< cout< cin.get();
return 0;
}
这里如果现实a,b值都相同的话那是因为操作系统在fun(10); 调用完成后,摧毁掉fun(10); 的数据,又调用fun(20);此时在原来fun(10); 的遗址上建数据,会出现输出相同的结果,试试看。打字好累的说,顶一个吧!!!
不能返回局部变量的引用,所以两个都是错的。
没有出错,可能跟编译环境有关
有的编译器是立刻回收局部变量空间,有的不是
总之不要这样做就好了。
说1错2对那位老兄,如果程序的运行已经回到了主调函数了,准备给b赋值,这时fun中的局部变量a还会在?你现在是想返回a本身,不是返回a的副本。
相反,说指向的内存还没被“覆盖”那位大大的说法靠谱很多。不过不建议用这种特性。
另外,楼主可以看看这个帖子http://tieba.baidu.com/p/1939609253,看幻の上帝、Hope_20121221_、lwgz这几位的回复
不知道