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

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

代码如下:

#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;
}

结果就是这样:

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

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

猜你喜欢

转载自blog.csdn.net/Skying_/article/details/80571484