举例实现一个深拷贝构造和移动构造
以下是一个实现深拷贝构造和移动构造的例子:
#include <iostream>
#include <cstring>
class MyString {
public:
MyString(const char* str = nullptr) {
if (str != nullptr) {
m_size = strlen(str);
m_data = new char[m_size + 1];
strcpy(m_data, str);
}
else {
m_size = 0;
m_data = new char[1];
*m_data = '\0';
}
}
// 深拷贝构造函数
MyString(const MyString& other) {
m_size = other.m_size;
m_data = new char[m_size + 1];
strcpy(m_data, other.m_data);
}
// 移动构造函数
MyString(MyString&& other) noexcept {
m_size = other.m_size;
m_data = other.m_data;
other.m_size = 0;
other.m_data = nullptr;
}
~MyString() {
delete[] m_data;
}
const char* getData() const {
return m_data;
}
private:
char* m_data;
size_t m_size;
};
int main() {
MyString str1("Hello");
MyString str2(str1); // 深拷贝构造
MyString str3(std::move(str1)); // 移动构造
std::cout << "str1: " << str1.getData() << std::endl; // 输出为空,因为资源已被移动
std::cout << "str2: " << str2.getData() << std::endl; // 输出 "Hello"
std::cout << "str3: " << str3.getData() << std::endl; // 输出 "Hello"
return 0;
}
该例子实现了一个简单的字符串类 MyString,其中包含了深拷贝构造函数和移动构造函数。
深拷贝构造函数通过分配新的内存空间,并将原始数据复制到新的内存空间中,来创建一个新的对象。
移动构造函数通过将原始对象的指针和大小传递给新的对象,并将原始对象的指针和大小设置为默认值,来创建一个新的对象。这样做的好处是避免了不必要的内存复制和分配操作,提高了效率。
在 main 函数中,首先创建了一个 MyString 对象 str1,然后分别使用深拷贝构造函数和移动构造函数,创建了两个新的对象 str2 和 str3。最后输出了三个字符串对象的数据,验证了深拷贝构造和移动构造的正确性
原文地址: https://www.cveoy.top/t/topic/iFZ1 著作权归作者所有。请勿转载和采集!