移动和拷贝
标准库容器、string 和 shared_ptr 类既 支持移动也支持拷贝。
--赋值和拷贝
对象大 对象本身要求内存分配--不必复制
IO 类和 unique_ptr 类 可以移动但不能拷贝
01.IO类型不可存储在vector容器中。
(IO是流对象,而流对象是不能复制的,所以不能存储在vector容器中 IO对象不可复制或赋值
不能将 形参 或 返回类型 设置为 流类型。进行 IO 操作的函数通常以引用方式 传递和 返回流。
读写一个 IO 对象会改变其状态,因此传递和返回的引用不能是 const
传递或返回IO对象,则必须传递或返回指向该对象的指针或引用。
02.unique_ptr智能指针在同一时间只允许一个智能指针管理动态开辟的空间
std::unique_ptr的特性之一是它不能被复制,因为它拥有对其所管理的对象的唯一所有权。
然而,它可以被移动,这意味着可以将其所有权从一个std::unique_ptr转移到另一个std::unique_ptr
右值引用
右值引用和移动语义 std::unique_ptr
普通左值引用
左值引用就是给左值的引用,给左值取别名
const 左值引用
右值引用 右值引用:使用&&符号定义 编译器
右值的生命周期一般只在当前语句
移动
移动构造函数 nonexcept
移动运算符
#include <utility> std::move() std::forward()
资源的所有权
###既有移动构造函数又有拷贝构造函数
函数的匹配的原则
定义了拷贝构造函数但未定义移动构造函数时,std::move会触发拷贝构造函数而非移动构造函数
std::move 并不强制一个对象进行移动操作,而是将对象的引用转换为右值引用,
这使得编译器能够选择执行移动构造函数(如果有的话)或者退而使用拷贝构造函数(如果没有合适的移动构造函数)。
成员函数--提供移动版本和拷贝版本
拷贝和移动
虽然技术上你可以定义一个接受非常量引用的拷贝构造函数,
但在实际编程中,使用常量引用参数的拷贝构造函数更为常见和推荐。const
这样可以确保代码的安全性和效率,同时减少不必要的副作用