C++笔记(面向对象)深赋值 浅赋值

深赋值 浅赋值

浅拷贝赋值(浅赋值)

浅拷贝赋值是指在对象赋值时,只是简单地将源对象的成员变量的值(包括指针值)逐位复制到目标对象中。对于指针类型的成员变量,浅拷贝赋值不会为目标对象重新分配新的内存空间,而是让目标对象的指针成员和源对象的指针成员指向同一块内存区域。

cpp 复制代码
class ShallowClass {
public:
    int* data;
    // 构造函数,动态分配内存
    ShallowClass(int val) {
    data = new int(val);
    }
    // 浅拷贝赋值运算符(默认生成的或简单实现的)
    ShallowClass& operator=(const ShallowClass& other) {
    if (this != &other) {
        // 直接复制指针值,没有为 data 重新分配内存
        data = other.data;
    }
    return *this;
}
~ShallowClass() {
delete data; // 析构时释放内存
}
};

在上述代码中,当执行 `ShallowClass obj2 = obj1;`(假设 `obj1` 是已初始化的对象)这样的赋值操作时,`obj2.data` 和 `obj1.data` 会指向同一块堆内存。

问题

当其中一个对象(如 `obj1`)的析构函数被调用,释放了 `data` 指向的内存后,另一个对象(`obj2`)的 `data` 就变成了**悬空指针**(指向已释放的内存)。如果后续再通过 `obj2.data` 访问或操作这块内存,就会导致未定义行为(如程序崩溃、数据错乱等)。

深拷贝赋值(深赋值)

深拷贝赋值则是在对象赋值时,不仅复制源对象成员变量的值,对于指针类型的成员变量,会为目标对象重新分配一块新的内存空间,然后将源对象指针指向的内容复制到这块新内存中,使得目标对象和源对象各自拥有独立的资源副本,互不影响。

cpp 复制代码
class DeepClass {
public:
    int* data;
    // 构造函数,动态分配内存
    DeepClass(int val) {
        data = new int(val);
    }
    // 深拷贝赋值运算符
    DeepClass& operator=(const DeepClass& other) {
        if (this != &other) {
            delete data; // 先释放当前对象已有的资源
            data = new int(*other.data); // 为当前对象重新分配内存并复制内容
        }
        return *this;
    }
    ~DeepClass() {
        delete data; // 析构时释放内存
    }
};
```

当执行 `DeepClass obj2 = obj1;` 这样的赋值操作时,`obj2.data` 会指向一块新的堆内存,这块内存中存储的内容与 `obj1.data` 指向的内存内容相同。

深拷贝赋值保证了每个对象都有自己独立的资源,一个对象对资源的修改(如通过指针修改指向的内容)不会影响到另一个对象,同时在对象析构时,各自释放自己拥有的资源,避免了悬空指针和多次释放同一块内存等问题。

浅赋值:只复制指针值,多个对象共享同一份资源,存在资源管理风险(如悬空指针、重复释放)。

深赋值:为目标对象重新分配资源并复制内容,每个对象拥有独立资源,资源管理更安全。

在实际编程中,当类中包含动态分配的资源(如指针指向堆内存、动态数组等)时,通常需要自定义深拷贝赋值运算符,以确保对象赋值时资源的正确管理;如果类中没有动态资源,使用默认的浅拷贝赋值(由编译器生成)一般不会有问题。

相关推荐
自小吃多几秒前
DXF文件导入与PCB板框定义笔记
笔记·嵌入式硬件
会周易的程序员11 分钟前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
小灰灰搞电子23 分钟前
完全驾驭 Qt 与数据库:C++ ORM 框架 QxOrm 原理与实践指南
数据库·c++·qt
QT界面美化性能优化31 分钟前
QT+AI:使用AI技术为QT应用程序赋能
c++·人工智能·qt·opencv·qt教程·qt6.3
是隼人1 小时前
buuctf-pwn xdctf2015_pwn200题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
jike_20261 小时前
iPhone采访录音同时拍现场照片的APP:图片音频同步记录实测
笔记·智能手机·音视频·语音识别
大衛說2 小时前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习
吃好睡好便好3 小时前
查找函数的使用
学习·算法·matlab·生活·查找函数
学习星球3 小时前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode
学运维的Kysan3 小时前
暑假运维学习打卡第二十九天8.29
学习