鱼C论坛

 找回密码
 立即注册
查看: 31|回复: 1

[技术交流] 面向对象-深拷贝与浅拷贝

[复制链接]
发表于 昨天 23:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <iostream>

using namespace std;

// 浅拷贝:在拷贝构造函数中,直接完成属性的值拷贝操作(默认的拷贝构造函数)
// 深拷贝:在拷贝构造函数中,开辟一块新的区域,让属性的指针指向一块新的空间

class Cat {
public:
        string name;
        int age;
};

class Person {
public:
        int        age;
        Cat* pet;

        Person() {
                age = 0;
                pet = new Cat();
        }

        // 拷贝构造函数
        Person(const Person& p) {
                // 默认的拷贝构造函数的实现,就是浅拷贝,直接完成值的拷贝操作
                age = p.age;
                // pet = p.pet;// 浅拷贝会导致析构函数执行之后xiaobai的pet无法释放,会报错
                pet = new Cat;
                pet->name = p.pet->name;
                pet->age = p.pet->age;
        }

        ~Person() {
                if (pet!=nullptr)
                {
                        delete pet;
                        pet = nullptr;
                }
        }
};
int main() {

        Person xiaobai;
        Person xiaohei = xiaobai;

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 昨天 23:31 | 显示全部楼层
你给出的代码演示了深拷贝和浅拷贝的区别。在面向对象编程中,深拷贝和浅拷贝是两个重要的概念,尤其在涉及动态内存分配时。

浅拷贝与深拷贝的区别

  • 浅拷贝: 复制对象时只复制对象的基本数据类型成员,对于指针成员,拷贝的是指针的地址。这意味着多个对象可能指向同一个内存地址。
  • 深拷贝: 除了复制对象的基本数据类型成员,还会为指针成员分配新的内存空间,并复制内容。这确保每个对象都有自己独立的内存空间。


在你的代码中,`Person`类的拷贝构造函数通过 new Cat 为指针成员 pet 分配新的内存空间,从而实现了深拷贝。这样,当对象被销毁时,每个对象可以安全地释放其各自的资源,避免了因多次释放同一块内存而导致的错误。

以下是代码中的关键部分解释:
Person(const Person& p) {
    age = p.age;
    pet = new Cat;  // 为新对象分配新的内存空间
    pet->name = p.pet->name;  // 复制具体内容
    pet->age = p.pet->age;
}

通过这种方式,当 Person xiaohei = xiaobai; 执行时,xiaohei 拥有自己独立的 Cat* pet 实例,而不是与 xiaobai 共享。

这样设计确保了在析构函数中,内存能够被正确释放:
~Person() {
    if (pet != nullptr) {
        delete pet;
        pet = nullptr;
    }
}

如果有任何其他问题,随时提出!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-2-24 08:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表