为什么C++函数可以返回Vector局部变量

C++函数可以返回Vector局部变量问题

  • 函数返回的Vector是右值。
  • 接收右值会调用移动构造函数。移动构造函数将栈中数据的所有权转移到函数外了。

Vector存放在栈区,函数返回的Vector是右值,接收右值会调用移动语义,移动语义会修改对象所有权。
因此栈内的数据没有随着函数结束被销毁,而是所有权发生了变更。
更多移动语义相关介绍,可以看本人的文章。三、精通类与对象

在下面的例子中,因为只是修改对象所有权,所以两个vec[0]的地址是相同的。

#include <iostream>
#include <vector>

using namespace std;

// 返回一个vector变量,并打印vec的地址和存放在容器中第一个数据的首地址
vector<int> fun() {
    vector<int> vec;    // 创建vector
    vec.push_back(10);   // 添加一个元素

    cout << "fun():&vec" << &vec << endl;
    cout << "fun():&vec[0]" << &vec[0] << endl;

    return vec;   // 返回vector

}

int main() {
    vector<int> vec;   // 创建一个vector
    vec = fun();      // 接收传来的参数

    cout << "----------------------" <<endl;

    cout << "main():&vec" << &vec << endl;
    cout << "main():&vec[0]" << &vec[0] << endl;
    
    system("pause");
    return 0;
}

在这里插入图片描述

Fig. 1. 运行结果

如有陈述纰漏,还望前辈不吝指教。

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值