生成一个移动拷贝和右值引用结合的例子
时间: 2024-05-15 16:16:36 浏览: 51
下面是一个简单的例子,演示如何使用移动构造函数和右值引用来创建一个移动拷贝:
```c++
#include <iostream>
#include <string>
class MyString {
public:
// 构造函数
MyString() : mData(nullptr), mLength(0) {}
MyString(const char* str) {
mLength = strlen(str);
mData = new char[mLength + 1];
strcpy(mData, str);
}
// 移动构造函数
MyString(MyString&& other) : mData(other.mData), mLength(other.mLength) {
other.mData = nullptr;
other.mLength = 0;
}
// 右值引用赋值运算符
MyString& operator=(MyString&& other) {
if (this != &other) {
delete[] mData;
mData = other.mData;
mLength = other.mLength;
other.mData = nullptr;
other.mLength = 0;
}
return *this;
}
// 析构函数
~MyString() {
delete[] mData;
}
// 输出字符串
friend std::ostream& operator<<(std::ostream& os, const MyString& str) {
os << str.mData;
return os;
}
private:
char* mData;
size_t mLength;
};
int main() {
MyString str1("Hello");
MyString str2(std::move(str1));
std::cout << "str2: " << str2 << std::endl;
MyString str3("World");
str2 = std::move(str3);
std::cout << "str2: " << str2 << std::endl;
return 0;
}
```
在这个例子中,我们定义了一个`MyString`类,它表示一个字符串。我们实现了默认构造函数、带参数构造函数、移动构造函数、右值引用赋值运算符和析构函数。
在`main()`函数中,我们首先创建了一个`MyString`对象`str1`,然后使用移动构造函数将其移动到`str2`中。接下来,我们创建了另一个`MyString`对象`str3`,然后使用右值引用赋值运算符将其移动到`str2`中。最后,我们输出`str2`的值,以验证它已成功移动。
注意:在实际开发中,移动构造函数和右值引用赋值运算符通常是使用模板实现的。此处我们为了简化代码,使用了非模板实现。
阅读全文