当前位置:首页 C++ > 正文

c++浅拷贝和深拷贝

作者:野牛程序员:2023-07-21 08:22:00 C++阅读 2673

在 C++ 中,拷贝构造函数和赋值运算符涉及两种拷贝方式:浅拷贝和深拷贝。这两种拷贝方式适用于类中包含动态分配内存或指针的情况。

  1. 浅拷贝(Shallow Copy): 浅拷贝是简单地复制一个对象的内容到另一个对象,包括指针变量的值(地址)。这意味着两个对象将指向同一块内存,因此对其中一个对象的修改会影响到另一个对象。

示例:

#include <iostream>

class ShallowCopyExample {
private:
    int* data;

public:
    ShallowCopyExample(int value) {
        data = new int;
        *data = value;
    }

    // 拷贝构造函数(浅拷贝)
    ShallowCopyExample(const ShallowCopyExample& other) {
        data = other.data; // 这里进行了浅拷贝
    }

    // 析构函数释放动态分配的内存
    ~ShallowCopyExample() {
        delete data;
    }

    int getData() const {
        return *data;
    }
};

int main() {
    ShallowCopyExample obj1(42);
    ShallowCopyExample obj2 = obj1; // 调用拷贝构造函数进行浅拷贝

    std::cout << "Object 1 data: " << obj1.getData() << std::endl;
    std::cout << "Object 2 data: " << obj2.getData() << std::endl;

    // 修改 obj1 的数据,会影响 obj2,因为它们共享同一块内存
    *obj1.data = 99;

    std::cout << "After modifying obj1:" << std::endl;
    std::cout << "Object 1 data: " << obj1.getData() << std::endl;
    std::cout << "Object 2 data: " << obj2.getData() << std::endl;

    return 0;
}

输出:

Object 1 data: 42
Object 2 data: 42
After modifying obj1:
Object 1 data: 99
Object 2 data: 99
  1. 深拷贝(Deep Copy): 深拷贝是创建一个新的对象,并将原始对象中指针所指向的内容复制到新对象中的新内存地址。这样,两个对象是相互独立的,修改一个对象的数据不会影响到另一个对象。

示例:

#include <iostream>

class DeepCopyExample {
private:
    int* data;

public:
    DeepCopyExample(int value) {
        data = new int;
        *data = value;
    }

    // 拷贝构造函数(深拷贝)
    DeepCopyExample(const DeepCopyExample& other) {
        data = new int; // 创建新的内存空间
        *data = *other.data; // 复制原始对象的数据
    }

    // 析构函数释放动态分配的内存
    ~DeepCopyExample() {
        delete data;
    }

    int getData() const {
        return *data;
    }
};

int main() {
    DeepCopyExample obj1(42);
    DeepCopyExample obj2 = obj1; // 调用拷贝构造函数进行深拷贝

    std::cout << "Object 1 data: " << obj1.getData() << std::endl;
    std::cout << "Object 2 data: " << obj2.getData() << std::endl;

    // 修改 obj1 的数据,不会影响 obj2,因为它们拥有独立的内存空间
    *obj1.data = 99;

    std::cout << "After modifying obj1:" << std::endl;
    std::cout << "Object 1 data: " << obj1.getData() << std::endl;
    std::cout << "Object 2 data: " << obj2.getData() << std::endl;

    return 0;
}

输出:

Object 1 data: 42
Object 2 data: 42
After modifying obj1:
Object 1 data: 99
Object 2 data: 42

注意:在实际使用中,要根据情况决定是使用浅拷贝还是深拷贝,以确保对象之间的行为和数据符合预期。在包含动态内存分配的情况下,深拷贝通常是更安全的选择,因为它避免了因浅拷贝引起的潜在问题。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击