深拷贝与浅拷贝

深拷贝与浅拷贝

在这里插入图片描述

1、浅拷贝

1、浅拷贝 (Shallow Copy) 只复制某个对象的指针, 而不复制对象本身, 新旧对象还是共享同一块内存.
2、在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数——即浅拷贝,它能够完成成员的一一复制。当数据成员中没有指针时,浅拷贝是可行的,但当数据成员中有指针时,如果采用简单的浅拷贝,则两类中的两个指针将指向同一个地址,当对象快结束时,会调用两次析构函数,从而导致指针悬挂现象,所以,此时,必须采用深拷贝。

2、深拷贝

1、深拷贝 (Deep Copy) 在拷贝的过程中会另外创造一个一模一样的对象. 新对象跟原对象不共享内存, 修改新对象不会改到原对象.
2、当拷贝的对象中有对其他资源(如堆、文件、系统等)的引用时,对象另外开辟一块新的资源,而不再对拷贝对象中有对其他资源的引用的指针或引用进行单纯的赋值。

区别

深拷贝和浅拷贝的区别就在于深拷贝会在堆内存中另外申请空间来存储数据,从而也就解决了指针悬挂的问题。当数据成员中有指针时,必须要用深拷贝。

#include<iostream>

using namespace std;

//深拷贝
class A
{
public:
    A(int _size):size(_size)
    {
		data = new int[size];//指针变量名 = new type[内存单元个数]
    }
    A();
    A(const A &_A):size(_A.size)
    {
		data = new int[size];//开辟了一个新的空间
    }//深拷贝
    ~A()
    {
        delete []data;
    }//析构时释放资源

    int *data;
    int size;
};

//浅拷贝
class B
{
public:
    B(int _data):data(_data){}//传入一个值_data,然后把_data的值给data
    B();

    int data;
};


int main()
{
    A a(5),b=a;
    a.size = 10;

    B a1(6);
    B b1=a1;//仅仅是数据成员之间的赋值
    a1.data=5;

    cout << "深拷贝" << endl  << a.size << endl << b.size << endl;

    cout << "浅拷贝" << endl  << a1.data << endl << b1.data << endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值