C++ 深拷贝构造和移动构造函数实现示例
C++ 深拷贝构造和移动构造函数实现示例
以下是一个实现深拷贝构造和移动构造函数的 C++ 代码示例,它演示了如何在一个简单的字符串类 MyString 中实现这些构造函数。
#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;
}
解释:
-
深拷贝构造函数
- 创建一个新的内存空间,并将原始数据复制到新的内存空间中。
- 确保新的对象拥有自己的数据副本,不会影响原始对象。
-
移动构造函数
- 将原始对象的指针和大小传递给新的对象,并将原始对象的指针和大小设置为默认值。
- 避免不必要的内存复制和分配操作,提高了效率。
代码说明:
-
在
main函数中,创建三个MyString对象:str1:使用初始化列表创建,并包含字符串 "Hello"。str2:使用深拷贝构造函数从str1创建,str2拥有str1的数据副本。str3:使用移动构造函数从str1创建,str3接收str1的资源,str1变成空对象。
-
输出结果:
str1是空字符串,因为它的资源已被移动到str3。str2和str3都包含字符串 "Hello",但str2是通过深拷贝创建的,str3是通过移动构造创建的。
结论:
- 深拷贝构造函数创建了原始数据的副本,确保独立性。
- 移动构造函数高效地将资源从一个对象转移到另一个对象,避免不必要的内存复制。
理解深拷贝和移动构造的概念,可以帮助你编写更有效率和安全的 C++ 代码,尤其是在处理大型数据对象时。
原文地址: https://www.cveoy.top/t/topic/qmws 著作权归作者所有。请勿转载和采集!