一、移動構造函數和拷貝構造函數的區別
拷貝構造函數(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;
}
原創文章,作者:TUWOI,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/368054.html
微信掃一掃
支付寶掃一掃