C++11 引入了移動(dòng)語義,它允許資源(如內(nèi)存、文件句柄等)從一個(gè)對(duì)象轉(zhuǎn)移到另一個(gè)對(duì)象,而不是像傳統(tǒng)的拷貝語義那樣創(chuàng)建資源的副本。移動(dòng)語義通過引入右值引用、std::move
函數(shù)和移動(dòng)構(gòu)造函數(shù)等特性來實(shí)現(xiàn)。
雖然 C++ 標(biāo)準(zhǔn)庫中的移動(dòng)語義已經(jīng)固定,但你可以在你的代碼中實(shí)現(xiàn)自定義的移動(dòng)語義。例如,你可以為你的類提供自定義的移動(dòng)構(gòu)造函數(shù)和移動(dòng)賦值運(yùn)算符,以便在需要時(shí)實(shí)現(xiàn)資源的轉(zhuǎn)移。
這里有一個(gè)簡單的例子,展示了如何為自定義類實(shí)現(xiàn)移動(dòng)語義:
#include <iostream>
#include <string>
class MyString {
public:
// 默認(rèn)構(gòu)造函數(shù)
MyString() : data(nullptr), size(0) {}
// 拷貝構(gòu)造函數(shù)
MyString(const MyString& other) {
data = new char[other.size + 1];
std::copy(other.data, other.data + other.size, data);
size = other.size;
}
// 移動(dòng)構(gòu)造函數(shù)
MyString(MyString&& other) noexcept : data(other.data), size(other.size) {
other.data = nullptr;
other.size = 0;
}
// 拷貝賦值運(yùn)算符
MyString& operator=(const MyString& other) {
if (this != &other) {
delete[] data;
data = new char[other.size + 1];
std::copy(other.data, other.data + other.size, data);
size = other.size;
}
return *this;
}
// 移動(dòng)賦值運(yùn)算符
MyString& operator=(MyString&& other) noexcept {
if (this != &other) {
delete[] data;
data = other.data;
size = other.size;
other.data = nullptr;
other.size = 0;
}
return *this;
}
// 析構(gòu)函數(shù)
~MyString() {
delete[] data;
}
// 獲取字符串長度
size_t length() const {
return size;
}
// 獲取字符串?dāng)?shù)據(jù)
const char* c_str() const {
return data;
}
private:
char* data;
size_t size;
};
int main() {
MyString s1("hello");
MyString s2 = std::move(s1); // 使用移動(dòng)語義將 s1 的資源轉(zhuǎn)移到 s2
std::cout << "s1 length: " << s1.length() << std::endl; // 輸出 0,因?yàn)?s1 的資源已被移動(dòng)
std::cout << "s2 length: " << s2.length() << std::endl; // 輸出 5,因?yàn)?s2 的資源是從 s1 移動(dòng)過來的
return 0;
}
在這個(gè)例子中,我們?yōu)?MyString
類提供了自定義的移動(dòng)構(gòu)造函數(shù)和移動(dòng)賦值運(yùn)算符,以便在需要時(shí)實(shí)現(xiàn)資源的轉(zhuǎn)移。這樣,當(dāng)我們將一個(gè) MyString
對(duì)象移動(dòng)到另一個(gè)對(duì)象時(shí),資源會(huì)被有效地轉(zhuǎn)移,而不是被復(fù)制。這可以提高性能,特別是在處理大型資源時(shí)。