如下为一个正常运行的程序。
int & test01()//这里的&不可少,因为返回的变量需由一个同类型的变量去发送
{
static int a=0;//静态变量,存放在全局区,全局区上的变量在程序结束后由系统释放
return a;
}
int main()
{
int & ref = test01();//这里的&可少,可以用引用去接收,也可以用一个普通的变量去接收
cout<<ref<<endl;
return 0;
}
但是如果我们将该程序中定义函数语句改为int test01()
程序会进行报错。完整代码如下:
int test01()//这里有变化
{
static int a=0;
return a;
}
int main()
{
int & ref = test01();
cout<<ref<<endl;
return 0;
}
为什么?似乎我们的test01()
函数返回了一个变量,在main()中用一个引用ref
去接收是完全没问题的啊!?
关键在于 return!!! 或者说函数参数的传递。
核心内容
函数在传递、返回参数的时候只有两种形式:值传递和地址传递,所以看似返回了a
这个变量,其实是返回了一个“拷贝”的a的值
,ref
指向的就是存储该“拷贝”值的存储空间,而该存储空间在回传a值
之后就释放了,ref
的指向就空掉了,所以不能用引用去接收。
在无法理解这种情况时只需牢记:引用是别名,本质为地址(指针),但是编译器会自动给这个指针加上语句,所以把引用当作一个变量来使用。
最后,再来看一看最开始的正确程序的逻辑。
函数返回类型是在返回的时候用一个引用去代表a,类似于
int &b=a;return b;
,相当于返回了一个地址,所以接收到这个地址的引用ref
其实指向的是静态局部变量static int a
。
再举个例子
class Person
{
public:
int m_a;
int m_b;
};
ostream & operator<<(ostream & cout,Person & p)//知识点在这里!!!
{
cout<<"m_a= "<<p.m_a<<" m_b="<<p.m_b;
return cout;
}
void test01()
{
Person p;
p.m_a=10;
p.m_b=20;
cout<<p<<endl;//知识点在这里!!!
}
int main()
{
test01();
return 0;
}
这里要不要加&???引用作为函数返回值,如果没有&,返回的是函数定义中的形参ostream & cout
的拷贝值,返回后会被立刻释放,但加上&,返回为ostream & cout
所接收到的那个对象的地址,是不会销毁的。所以需要加上&。
非专业解答,若有错误还请批评指正。