移动构造函数
移动构造函数与拷贝构造函数的区别是,拷贝构造的参数是
const MyString& str
,是常量左值引用,而移动构造的参数是
MyString&& str
,是右值引用,而
MyString("hello")
是个临时对象,是个右值,优先进入移动构造函数而不是拷贝构造函数。
移动构造函数与拷贝构造不同,它并不是重新分配一块新的空间,将要拷贝的对象复制过来,而是"偷"了过来,将自己的指针指向别人的资源,然后将别人的指针修改为nullptr
,这一步很重要,如果不将别人的指针修改为空,那么临时对象析构的时候就会释放掉这个资源。
std::move
将左值强制转化为右值使用,以用于移动拷贝或赋值,避免对含有资源的对象发生无谓的拷贝。
move
对于拥有如内存、文件句柄等资源的成员的对象有效,如果是一些基本类型,如int和char[10]数组等,如果使用move,仍会发生拷贝(因为没有对应的移动构造函数),所以说move
对含有资源的对象说更有意义。