c++移动构造和赋值的样例
#include <iostream>
class MyResource {
public:
// 默认构造函数
MyResource(size_t size = 0)
: m_size(size), m_data(size ? new int[size] : nullptr) {
std::cout << "Default constructor called\n";
}
// 析构函数
~MyResource() {
delete[] m_data;
std::cout << "Destructor called\n";
}
// 拷贝构造函数
MyResource(const MyResource& other)
: m_size(other.m_size), m_data(other.m_size ? new int[other.m_size] : nullptr) {
std::copy(other.m_data, other.m_data + m_size, m_data);
std::cout << "Copy constructor called\n";
}
// 拷贝赋值运算符
MyResource& operator=(const MyResource& other) {
if (this == &other)
return *this;
delete[] m_data;
m_size = other.m_size;
m_data = other.m_size ? new int[other.m_size] : nullptr;
std::copy(other.m_data, other.m_data + other.m_size, m_data);
std::cout << "Copy assignment operator called\n";
return *this;
}
// 移动构造函数
MyResource(MyResource&& other) noexcept
: m_size(other.m_size), m_data(other.m_data) {
other.m_size = 0;
other.m_data = nullptr;
std::cout << "Move constructor called\n";
}
// 移动赋值运算符
MyResource& operator=(MyResource&& other) noexcept {
if (this == &other)
return *this;
delete[] m_data;
m_size = other.m_size;
m_data = other.m_data;
other.m_size = 0;
other.m_data = nullptr;
std::cout << "Move assignment operator called\n";
return *this;
}
// 获取大小
size_t size() const {
return m_size;
}
// 检查数据指针
const int* data() const {
return m_data;
}
private:
size_t m_size; // 存储大小
int* m_data; // 指向资源的指针
};
int main() {
MyResource res1(10); // 调用默认构造函数
MyResource res2 = std::move(res1); // 调用移动构造函数
MyResource res3; // 调用默认构造函数
res3 = std::move(res2); // 调用移动赋值运算符
return 0;
}
- 默认构造函数: 初始化资源(如果有大小)。
- 析构函数: 释放动态分配的资源。
- 拷贝构造函数: 深拷贝资源。
- 拷贝赋值运算符: 先删除已有资源再深拷贝新资源。
- 移动构造函数: 转移资源所有权,将源对象的资源指针置空。
- 移动赋值运算符: 先删除已有资源,接着转移新资源的所有权并将源对象的资源指针置空。
原文地址:https://blog.csdn.net/youth0532/article/details/139296285
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!