以下是一个实现深拷贝构造和移动构造的例子:

#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,然后分别使用深拷贝构造函数和移动构造函数,创建了两个新的对象 str2str3。最后输出了三个字符串对象的数据,验证了深拷贝构造和移动构造的正确性

举例实现一个深拷贝构造和移动构造

原文地址: https://www.cveoy.top/t/topic/iFZ1 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录