浅拷贝与深拷贝之间的区别

浅拷贝就是在类是以复制方式创建对象的时候,或者在变量进行复制的时候,没有设置自定义的拷贝构造函数或重载等号运算符的拷贝函数,导致对变量中的所有进行拷贝,包括指针,即指针只拷贝地址,不会再为指针变量申请内存。

代码如下:

#include<stdio.h>
class test
{
public:
	int num;
	int *point;
};
int main()
{
	test t1;
	t1.point=new int;
	scanf("%d",&t1.num);

	test t2=t1;
	printf("%d %d %p %p\n",t1.num,t2.num,t1.point,t2.point);
	t2=t1;
	printf("%d %d %p %p\n",t1.num,t2.num,t1.point,t2.point);
	return 0;
}

结果如下:

即两个指针指向了相同的地址,那这样有什么问题呢?别忘了,我们还没有设置析构函数。

#include<stdio.h>
class test
{
public:
	int num;
	int *point;
	~test()
	{
		delete point;
	}
};
int main()
{
	test t1;
	t1.point=new int;
	scanf("%d",&t1.num);

	test t2=t1;
	printf("%d %d %p %p\n",t1.num,t2.num,t1.point,t2.point);
	t2=t1;
	printf("%d %d %p %p\n",t1.num,t2.num,t1.point,t2.point);
	return 0;
}

我们加上析构函数来运行一下:

看到了吧,因为我们对同一块内存进行了两次析构,导致程序崩掉,而且,浅拷贝的另一个问题是我们在修改一个变量的时候,另一个变量会受到影响,这样耦合性很大的程序我们还是能避免尽量避免的好。所以怎样才能避免浅拷贝呢,就是使用深拷贝。我们为类实现自己的拷贝构造函数。

像这样:

#include<stdio.h>
class test
{
public:
	int num;
	int *point;
	test()
	{}

	test(test &tmp)
	{
		point = new int;
		*point = *tmp.point;
	}

	~test()
	{
		delete point;
	}
};
int main()
{
	test t1;
	t1.point=new int;
	scanf("%d",&t1.num);

	test t2=t1;
	printf("%d %d %p %p\n",t1.num,t2.num,t1.point,t2.point);
	return 0;
}

结果就是这样:

深拷贝两个指针使用了不同的内存。

但是深拷贝的代码中我为什么没有重载等号运算符呢?因为我不知道怎么判断一个类的指针成员变量是否申请了内存。他没申请的话,因为还没有发生复制,所以是野指针。申请了内存后,他便指向了那块内存,但是我实在是想不出来怎么判断是否已经申请了内存,所以我没有办法写重载等号函数。如果你找到了解决办法的话,还请您能留个言或邮箱告诉我一下,感谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值