您的位置:

移动构造函数的详细阐述

一、移动构造函数和拷贝构造函数的区别

拷贝构造函数(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;
}