C++随笔之对象移动

右值引用:必须绑定到右值的引用,右值引用只能绑定到一个将要销毁的对象上。
左值表达式表示一个对象右值表达式表示一个对象的
左值表达式:返回左值引用的函数、连同赋值、下标、解引用、前++/–
右值表达式:连同算术、关系、位、后++/–运算
右值引用的所有对象将会被销毁,该对象没有其它用户

移动构造函数和移动赋值运算符
这两个函数的参数必须是一个右值引用
必须保证移后的源对象销毁它无害(指针成员指向nullptr)

移动构造函数不分配任何新内存,接管被移动对象中的内存

noexcept(不抛异常):标准库能对异常发生时期自身的行为提供保障(如:vector.push_back发生异常,vecotr本身不会发生变化)
必须在内的头文件的声明中和定义中都指定noexcept

编译也会合成移动构造函数和移动赋值运算符
如果定义了拷贝构造、赋值运算符或析构函数 ,编译器不再合成
类中没有定义任何自己的拷贝成员,具每个数据成员都可以移动时才会生成合成函数

合成移动操作函数被隐式定义为=delete的情况
1.移动操作函数被定义为=default,但又不能移动所有成员
2.类中某个成员不能被移动

即有拷贝构造又有移动构造,使用普通函数匹配规则 确定调用哪个函数
如果 没有移动构造函数,右值std::move(object), object&& 也会被转换成const boject&被拷贝。
如: Object o = std::move(object);

不需要为函数操作定义接收一个const X&& 或 X&的参数版本。因为移动构造/赋值一般都要改变X,而拷贝一般都不会改X

函数参数列表后加引用限定符指定this的左、右值属性
&this是左值
&&this是右值
有多个相同名字和参数列表的成员函数加引用限定符必须同时都加或都不加

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值