c++对c的加强(五)

移动构造和移动赋值

  1. 作用:对象移动,解决(临时)对象拷贝带来的开销问题。
     Test getTest()  //类中
    {
    	Test t(“hello world”);  //在退出函数时空间自动释放
    	return t;            //而此时又需要有返回值,就产生了临时对象
    }
    	Test t1 = getTest();      
    //当移动构造函数未定义时,这里的t1想接收t时会调用拷贝构造函数
    //并且过程中会开辟一段新空间保存,产生额外开销
    
  2. 移动拷贝构造函数:Test (const Test && other){}
  3. 移动赋值运算符:Test & operator=( Test && other){}
    ①不使用&&,形参为对象生成临时对象,必然会调用耗时、开销大的拷贝构造函数。
    ②&左值引用,&&右值引用,使用std::move()可将左值转为右值。
    ③若没有声明,系统会自动生成默认的移动构造函数。
    ④移动不是内存数据移动到其他内存,而是变更所有权。
    注:变更所有权不是变更所有属性的所有权。
  4. 引入右值引用的目的:提高程序运行效率、把拷贝对象变成移动对象,省去调用拷贝、赋值开辟空间的过程。

补充·左值右值:可以通过&运算符获取地址的(可以绑定到其他引用的也是左值),就是左值,否则是右值。临时对象都是右值;有返回值的函数返回的都是右值。

Test(Test && other) noexcept
{
    this->m_name = other.m_name;
    other.m_name = nullptr;
    std::cout << "移动构造函数" << std::endl;
 }
 Person& operator=(Person&& person) noexcept
 {
    if (this != &person) {
      name_ = person.name_;
      std::cout << "移动赋值运算符" << std::endl;
    }
    return *this;
    //main中
  Person person1("xiaohong");
  Person person2("xiaoming");
  Person person3(getPerson());
  Person person4(std::move(person1));//移动构造函数
  Person person6("xiaolan");
  person6 = std::move(person3);//移动赋值运算
  Person person7("xiaoqi");
  person7 = Person("xiaoqi");//移动赋值运算

 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值