浅拷贝就是在类是以复制方式创建对象的时候,或者在变量进行复制的时候,没有设置自定义的拷贝构造函数或重载等号运算符的拷贝函数,导致对变量中的所有进行拷贝,包括指针,即指针只拷贝地址,不会再为指针变量申请内存。
代码如下:
#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;
}
结果就是这样:
深拷贝两个指针使用了不同的内存。
但是深拷贝的代码中我为什么没有重载等号运算符呢?因为我不知道怎么判断一个类的指针成员变量是否申请了内存。他没申请的话,因为还没有发生复制,所以是野指针。申请了内存后,他便指向了那块内存,但是我实在是想不出来怎么判断是否已经申请了内存,所以我没有办法写重载等号函数。如果你找到了解决办法的话,还请您能留个言或邮箱告诉我一下,感谢。