自学内容网 自学内容网

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)!