一、移动构造函数和拷贝构造函数的区别
拷贝构造函数(Copy Constructor)是C++中的一个特殊构造函数,其参数为const 类型的引用。它用来初始化一个类对象。如果不定义,编译器可以自动生成,一般为浅拷贝。而移动构造函数(Move Constructor)在C++ 11标准中引入,是一个特殊的构造函数,可以将一个右值引用的类对象移动到另一个对象上,避免了拷贝一遍对象。
转移数据时,程序优先使用移动构造函数。因为使用移动构造函数可以避免先删除对象,再构造新对象,从而提高效率。
二、移动构造函数的基本语法和实现
移动构造函数有不同于拷贝构造函数的语法:
class MyClass { public: // 移动构造函数 MyClass(MyClass &&obj) { // 移动 obj 的数据到 this } };
移动构造函数使用 && 语法,表示传入的参数是右值引用类型。
移动构造函数的实现可以使用 std::move 函数,表示转移数据:
class MyClass { public: MyClass(MyClass &&obj) { data = std::move(obj.data); obj.data = nullptr; } private: int *data; };
上面的代码就是将 obj 的 data 数据移动到 this 中,并将 obj 的 data 数据置为 nullptr。
三、移动构造函数的使用
移动构造函数的使用方法是将一个右值引用的类对象作为参数传入:
MyClass obj1; MyClass obj2 = std::move(obj1); // 调用移动构造函数
上面代码中,obj1 是左值,obj2 是右值,将 obj1 移动到 obj2 时,会调用 obj2 的移动构造函数。
四、完整的示例代码
下面是一个完整的示例代码,演示了移动构造函数的定义、实现和使用:
#include <iostream> #include <utility> class MyClass { public: MyClass() { data = new int[10]; } ~MyClass() { if (data != nullptr) { delete [] data; } } // 移动构造函数 MyClass(MyClass &&obj) { data = std::move(obj.data); obj.data = nullptr; } // 拷贝构造函数 MyClass(const MyClass &obj) { data = new int[10]; for (int i = 0; i < 10; i++) { data[i] = obj.data[i]; } } private: int *data; }; int main() { MyClass obj1; MyClass obj2 = std::move(obj1); // 调用移动构造函数 MyClass obj3 = obj2; // 调用拷贝构造函数 return 0; }