default rule of five c++

class MyClass {
public:
    // Step 1: Destructor
    ~MyClass() {
        // Release any resources, e.g., dynamic memory
        delete[] data;
    }

    // Step 2: Copy Constructor
    MyClass(const MyClass& other) {
        // Create a new copy of the data
        data = new int[other.size];
        std::copy(other.data, other.data + other.size, data);
        size = other.size;
    }

    // Step 3: Copy Assignment Operator
    MyClass& operator=(const MyClass& other) {
        // Check for self-assignment
        if (this != &other) {
            // Release existing resources
            delete[] data;

            // Create a new copy of the data
            data = new int[other.size];
            std::copy(other.data, other.data + other.size, data);
            size = other.size;
        }
        return *this;
    }

    // Step 4: Move Constructor
    MyClass(MyClass&& other) noexcept {
        // Steal resources from the source object
        data = other.data;
        size = other.size;

        // Reset the source object
        other.data = nullptr;
        other.size = 0;
    }

    // Step 5: Move Assignment Operator
    MyClass& operator=(MyClass&& other) noexcept {
        // Check for self-assignment
        if (this != &other) {
            // Release existing resources
            delete[] data;

            // Steal resources from the source object
            data = other.data;
            size = other.size;

            // Reset the source object
            other.data = nullptr;
            other.size = 0;
        }
        return *this;
    }

private:
    int* data;  // Example resource, e.g., dynamic memory
    std::size_t size;
};