使用函数返回引用变量

本文探讨了C++中函数返回引用变量可能导致的问题,特别是当引用的是局部变量时,由于作用域限制,可能导致引用失效。同时,介绍了右值引用的概念,它是如何延长临时对象的生命周期,避免昂贵的拷贝操作。文章还提供了实例代码来说明这些概念,并给出了右值引用的使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用函数返回引用变量


记录一下在工作中遇到的坑。
当函数返回引用变量会发生什么?先看代码:

int rtnValue1()
{
    int a = 1;
    return a;
}

int& rtnValue2()
{
    int a = 2;
    return a;
}

int main()
{
    int a1 = rtnValue1();
    int& a2 = rtnValue2();
    std::cout << a1 << " " << a2  << endl;
}

是不是代码没问题?? a2的值是多少?等于2吗???
然而打印结果显示a2的值不等于2。为什么?

因为rtnValue2函数返回的值是局部变量,而引用类型并不会重新分配存储单元,而是相当于给这个临时变量起了个别名,在函数执行完后,局部变量所占的内存被回,所以a2的值会改变。

看下面代码

int rtnValue1()
{
    int a = 1;
    std::cout <<"rtnValue1 "<< & a << " " << a << endl;
    return a;
}

int& rtnValue2()
{
    int a = 2;
    std::cout << "rtnValue2 " << &a << " " << a << endl;
    return a;
}

int main()
{
    int a1 = rtnValue1();
    int& a2 = rtnValue2();
    int&& a3 = rtnValue1();

    std::cout << &a1 <<" " << a1 << endl;
    std::cout << &a2 << " " << a2 << endl;
    std::cout << &a3 << " " << a3 << endl;
}

结果如下:
rtnValue1 0113FBE8 1
rtnValue2 0113FBE8 2
rtnValue1 0113FBE8 1
0113FCFC 1
0113FBE8 1524406664
0113FCD8 1

a2的地址是临时变量的地址,会被程序其他地方使用。那么a3是个什么东西?
右值引用
在C++中,常量、变量或表达式一定是左值(lvalue)或右值(rvalue)
左值:非临时的(具名的,可在多条语句中使用,可以被取地址)。可以出现在等号的左边或右边。可分为非常量左值和常量左值。
右值:临时的(不具名的,只在当前语句中有效,不能取地址)。只能出现在等号的右边。可分为非常量右值和常量右值。
左值引用:对左值的引用就是左值引用。可分为非常量左值引用和常量左值引用。 例如int & a = b;
右值引用(Rvalue References):对右值的引用就是右值引用。可分为非常量右值引用和常量右值引用。例如int && a = b;为临时对象的右值,它的生命周期很短暂,一般在执行完当前这条表达式之后,就释放了。
通过将其赋值给右值引用,可以在不进行昂贵的拷贝操作的情况下被“续命”,让其生命周期与右值引用类型变量的生命周期一样长。

下面的文章总结的很好,记录一下
https://blog.youkuaiyun.com/vc43vc/article/details/82927854

https://blog.youkuaiyun.com/weixin_40539125/article/details/81410008?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-81410008-blog-82927854.pc_relevant_vip_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-81410008-blog-82927854.pc_relevant_vip_default&utm_relevant_index=1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值