被 几个关于返回值的引用的问题困惑。。。
首先我们看两个例子:
例1.1
#include <iostream.h>
int whole;
int &Fun(int a);
int &Fun(int a)
{
whole=a*3;
return whole;
}
void main()
{
int P=Fun(2);
int &Q=Fun(2);
cout<<P<<endl<<Q<<endl;
}
例1.2
#include <iostream.h>
int &Fun(int a); int &Fun(int a){int temp=a*3; return temp;}
void main() {int P=Fun(2);int &Q=Fun(2);cout<<P<<endl<<Q<<endl;}
在1.1这个例子里面 运行出来的结果都是:6
6
原因都很简单,首先定义了一个全局变量whole它在main函数里面仍然存在的,int P=Fun(2) ;这个语句里面Fun()以引用的方式将whole传给P,可以这样理解 Fun()就是whole的别名,因为我们可以取地址,结果发现两者的地址是一致的。这样我把例1.1做一个小变化:
例1.1.1
#include <iostream.h>
int whole;
int &Fun(int a);
int &Fun(int a)
{
whole=a*3;
return whole;
}
void main()
{
int &Q=Fun(2);
int P=Fun(1);
cout<<P<<endl<<Q<<endl<<&Fun(1)<<endl<<&Fun(2)<<endl<<&whole<<endl;
}
我就可以很容易的得出结果
3
3
0x0042E058(地址)
0x0042E058(地址)
0x0042E058(地址)
在这里我只想提醒一下:int &Q=Fun(2);int P=Fun(1);这两个语句顺序不同,得出的结果也不一样的。
因为Q在这里也是whole的别名。
我们再来看1.2这个例子。与1.1不同的是 它首先没有定义全局变量,只是在函数申明的时候说明它是以引用的方式返回函数的值,但是int &Q=Fun(2);Q可以被引用,这就奇怪了,那Fun(2)肯定不是局部变量了。
为了更明确的对比一下局部变量和全局变量的区别我们看下面两个例子。
例1.2.1
#include <iostream.h>
int &Fun(int a); int &Fun(int a) { int temp=a*3; return temp;}void main() {
int *Q=&Fun(2);int &P=Fun(2);
cout<<&Fun(2)<<endl<<Q<<endl<<&P<<endl<<P<<endl<<*Q<<endl;}
例1.2.2
#include <iostream.h>
int Fun(int a); int Fun(int a) { int temp=a*3; return temp;}void main() {
int *Q=&Fun(2);//错误int &P=Fun(2);//错误
cout<<Fun(2)<<endl<<Q<<endl<<P<<endl;}
在例1.2.2中
int *Q=&Fun(2);//错误 int &P=Fun(2);//错误 为什么了? 很简单主要原因是局部变量会在函数返回后被销毁,所以赋值都没有成功。
而在例1.2.1中得出的结果是:0x0012FFF8
0x0012FF1C
0x0012FF1C
6
6 很惊异的发现Fun(2)的地址和Q所指的地址不一样,但是很奇怪的发现P引用的竟然和是 Q的地址是一样的。。 郁闷了。。不懂了。。
希望高手指点。。