C++11 引入了移動語義,通過右值引用和 std::move() 函數(shù)來實現(xiàn)資源的有效轉(zhuǎn)移,避免了不必要的拷貝。下面是一個簡單的例子來說明移動語義的實現(xiàn):
#include <iostream>
#include <string>
#include <vector>
#include <utility> // for std::move
class MyString {
public:
MyString() : data(nullptr), size(0) {}
MyString(const char* str) {
size = std::strlen(str);
data = new char[size + 1];
std::strcpy(data, str);
}
MyString(MyString&& other) noexcept : data(other.data), size(other.size) {
other.data = nullptr;
other.size = 0;
}
~MyString() {
delete[] data;
}
MyString& operator=(MyString&& other) noexcept {
if (this != &other) {
delete[] data;
data = other.data;
size = other.size;
other.data = nullptr;
other.size = 0;
}
return *this;
}
// Other member functions like copy constructor, assignment operator, etc.
private:
char* data;
int size;
};
int main() {
MyString s1("Hello, world!");
MyString s2 = std::move(s1); // Move semantics here
std::cout << "s1: " << s1.data << ", size: " << s1.size << std::endl;
std::cout << "s2: " << s2.data << ", size: " << s2.size << std::endl;
return 0;
}
在這個例子中,我們定義了一個簡單的 MyString
類,它包含一個指向字符數(shù)組的指針和一個表示字符串大小的整數(shù)。我們實現(xiàn)了移動構(gòu)造函數(shù)和移動賦值運算符,它們接受右值引用作為參數(shù),并將資源從源對象轉(zhuǎn)移到目標(biāo)對象。這樣,當(dāng)我們將 s1
傳遞給 s2
時,資源不會發(fā)生不必要的拷貝,而是直接轉(zhuǎn)移。
需要注意的是,移動語義并不總是適用的。在某些情況下,拷貝語義可能更合適。因此,在設(shè)計類時,我們需要根據(jù)實際情況權(quán)衡是否使用移動語義。