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
    • str2str3 都包含字符串 "Hello",但 str2 是通过深拷贝创建的,str3 是通过移动构造创建的。

结论:

  • 深拷贝构造函数创建了原始数据的副本,确保独立性。
  • 移动构造函数高效地将资源从一个对象转移到另一个对象,避免不必要的内存复制。

理解深拷贝和移动构造的概念,可以帮助你编写更有效率和安全的 C++ 代码,尤其是在处理大型数据对象时。

C++ 深拷贝构造和移动构造函数实现示例

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

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