🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## \[11+\][$]一.移动构造函数 ### 1.背景 若一个对象的一个指针类型的数据成员指向非常大的堆空间,当它复制构造时,这个空间一般需要重新拷贝一遍。然而有时对象复制完后,原对象就没用了(或者析构了)。这就会浪费不少时间和内存资源。 ### 2.概念 用对象的将亡值构造对象。 **移动的理解** 这里的移动,指的是堆空间,而数据成员占用的栈空间还是会复制。 ### 3.定义和声明 ```c++ //一般旧对象那里会加上 const ,防止原对象被修改。 //如需多个参数,后面的参数需要加默认值 类名(类名&& 旧对象) { //code here } ``` ### 4.作用 + 完成资源移动 + 确保源对象必须不再指向被移动的资源 ### 5.调用时机 用 **将亡值** 拷贝初始化 **即将创建的对象** 时。 ## \[11+\][$]二.移动赋值操作 ### 1.定义和声明 ```c++ //一般旧对象那里会加上 const ,防止原对象被修改。 类名 &operator =(类名&& 旧对象) { //code here } ``` ### 2.作用 + 完成资源移动 + 确保源对象必须不再指向被移动的资源 ### 3.调用时机 用 **将亡值** 拷贝赋值一个 **已存在的对象** 时。 ## \[11+\][$]三.合成的移动函数 ### 隐式移动函数产生的条件 1. 没有有用户定义的拷贝操作或移动操作。 2. 没有有用户定义的析构函数。 ### 隐式移动函数声明为删除的条件 1. 当非静态数据成员或基类不可移动(除 `const` 和 `引用` 外,其余内置类型均可移动)。 2. 当非静态数据成员不可移动且显式要求编译器生成合成的移动函数 `=default` 。