C++:引用作为返回值还是变量作为返回值

文章讲述了C++中函数返回值类型对引用和值的区别,强调了静态局部变量在返回引用时的作用,并通过Person类的例子说明了引用作为函数返回值的重要性。
摘要由CSDN通过智能技术生成

如下为一个正常运行的程序。

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所接收到的那个对象的地址,是不会销毁的。所以需要加上&。

非专业解答,若有错误还请批评指正。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值