C++(深拷贝、潜拷贝)

在C++中,深拷贝(deep copy)和浅拷贝(shallow copy)是涉及对象复制的两个概念,特别是当涉及到类或结构体时。下面我将解释这两个概念:

1. 浅拷贝(Shallow Copy):

浅拷贝是指将一个对象的内容复制到另一个对象,但如果对象中包含指针,则只会复制指针的值,而不是指针所指向的数据。这意味着两个对象会共享相同的数据,当其中一个对象的数据发生改变时,另一个对象的数据也会相应改变。

#include <iostream>

class ShallowCopyExample {
public:
    int* data;

    // Constructor
    ShallowCopyExample(int value) {
        data = new int(value);
    }

    // Shallow copy constructor
    ShallowCopyExample(const ShallowCopyExample& other) {
        data = other.data; // 只复制指针的值
    }

    // Destructor
    ~ShallowCopyExample() {
        delete data;
    }
};

int main() {
    ShallowCopyExample obj1(42);
    ShallowCopyExample obj2 = obj1; // 浅拷贝

    std::cout << *obj1.data << std::endl; // 输出: 42
    std::cout << *obj2.data << std::endl; // 输出: 42

    // 修改其中一个对象的数据
    *obj1.data = 99;

    // 由于浅拷贝,另一个对象的数据也会被修改
    std::cout << *obj1.data << std::endl; // 输出: 99
    std::cout << *obj2.data << std::endl; // 输出: 99

    return 0;
}

2. 深拷贝(Deep Copy):

深拷贝是指将一个对象的内容复制到另一个对象,并且复制指针所指向的实际数据,而不仅仅是复制指针的值。这样,两个对象有各自独立的数据,修改其中一个对象的数据不会影响另一个对象。

#include <iostream>

class DeepCopyExample {
public:
    int* data;

    // Constructor
    DeepCopyExample(int value) {
        data = new int(value);
    }

    // Deep copy constructor
    DeepCopyExample(const DeepCopyExample& other) {
        data = new int(*other.data); // 深拷贝:复制指针所指向的数据
    }

    // Destructor
    ~DeepCopyExample() {
        delete data;
    }
};

int main() {
    DeepCopyExample obj1(42);
    DeepCopyExample obj2 = obj1; // 深拷贝

    std::cout << *obj1.data << std::endl; // 输出: 42
    std::cout << *obj2.data << std::endl; // 输出: 42

    // 修改其中一个对象的数据
    *obj1.data = 99;

    // 由于深拷贝,另一个对象的数据不受影响
    std::cout << *obj1.data << std::endl; // 输出: 99
    std::cout << *obj2.data << std::endl; // 输出: 42

    return 0;
}

在实际编程中,确保使用适当的拷贝方式以防止意外的数据共享和修改。



posted @   做梦当财神  阅读(84)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示