浅拷贝和深拷贝具体详解

当用一个已经初始化了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用,也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用。

以下情况都会调用拷贝构造函数:

(1)一个对象以值传递的方式传入函数体

(2)一个对象以值传递的方式从函数返回

(3)一个对象需要通过另一个对象进行初始化

浅拷贝和深拷贝的概念:

       浅拷贝:如果在类中没有显示的声明一个拷贝构造函数,那么,编译器会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝,而位拷贝又称为浅拷贝。以下就是浅拷贝,而浅拷贝的过程就是说在某些情况下,需要用已初始化的对象去初始化一个新对象的时候,在没有自定义的拷贝构造函数时,系统调用默认构造函数,编译通过,但此时,a和b将指向同一个内存,根据构造函数和析构函数的特点,先构造的后析构,所以b会先析构,将这块内存的外部资源释放,再将内存释放,之后a内的指针就是野指针了,出现运行错误。

#include<iostream>
using namespace std;
class A:{
    A(){}
    ~A(){}
}
int main(){
    A a;
    A b=a;
}

        深拷贝:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝。

#include<iostream>
using namespace std;
class A:{
public:
    A(int data):ma(data),mb(data){}
    ~A(){}
    void A(const class &str){
        ma=str.ma;
        mb=str.mb;
    }
private:
    int ma;
    int mb;
}
int main(){
    A a(10);
    A b=a;
}
所以说,自定义拷贝构造函数是一种良好的编程风格,它可以阻止编译器形成默认的拷贝构造函数,提高源码效率。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目:使用 JavaScript 编写的杀死幽灵游戏(附源代码) 杀死鬼魂游戏是使用 Vanilla JavaScript、CSS 和 HTML 画布开发的简单项目。这款游戏很有趣。玩家必须触摸/杀死游荡的鬼魂才能得分。您必须将鼠标悬停在鬼魂上 - 尽量得分。鬼魂在眨眼间不断从一个地方移动到另一个地方。您必须在 1 分钟内尽可能多地杀死鬼魂。 游戏制作 这个游戏项目只是用 HTML 画布、CSS 和 JavaScript 编写的。说到这个游戏的特点,用户必须触摸/杀死游荡的幽灵才能得分。游戏会根据你杀死的幽灵数量来记录你的总分。你必须将鼠标悬停在幽灵上——尽量得分。你必须在 1 分钟内尽可能多地杀死幽灵。游戏还会显示最高排名分数,如果你成功击败它,该分数会在游戏结束屏幕上更新。 该游戏包含大量的 javascript 以确保游戏正常运行。 如何运行该项目? 要运行此游戏,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox。要玩游戏,首先,单击 index.html 文件在浏览器中打开游戏。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
深拷贝浅拷贝是在对象复制过程中常用的两种方式,它们的区别在于复制后的对象与原始对象之间的关系。 浅拷贝(Shallow Copy)是创建一个新对象,该对象与原始对象的元素是对原始对象中元素的引用。换言之,复制后的对象与原始对象共享内部对象的引用。当修改原始对象中的可变元素时,这些修改也会反映在复制后的对象中。 深拷贝(Deep Copy)则是创建一个全新的独立对象,复制后的对象与原始对象完全独立,互不影响。深拷贝会递归地复制原始对象及其内部所有可变对象,而不仅仅是引用。 举个例子来说明: ```python import copy # 原始对象 original_list = [1, 2, [3, 4]] # 浅拷贝 shallow_copy = copy.copy(original_list) # 深拷贝 deep_copy = copy.deepcopy(original_list) # 修改原始对象中的可变元素 original_list[0] = 10 original_list[2].append(5) print(original_list) # 输出: [10, 2, [3, 4, 5]] print(shallow_copy) # 输出: [10, 2, [3, 4, 5]] print(deep_copy) # 输出: [1, 2, [3, 4]] ``` 在上面的例子中,原始对象是一个列表 `original_list`,其中包含一个整数和一个列表。通过浅拷贝 `copy.copy()` 和深拷贝 `copy.deepcopy()` 分别创建了复制对象 `shallow_copy` 和 `deep_copy`。 当我们修改原始对象的第一个元素和第三个元素的子列表时,可以看到浅拷贝对象也受到了影响,而深拷贝对象保持不变。 因此,在需要创建独立的对象副本且避免修改原始对象时,深拷贝是更安全和可靠的选择,而浅拷贝则更适合在一些特定场景下节省内存或共享数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值