一、浅拷贝:就是有缺省的拷贝构造函数所实现的数据成员逐一赋值。
通常情况下,缺省的拷贝构造函数是可以胜任工作的。但是,如果数据成员中有指针类型,就会发生错误。
class Stu
{
private:
char *name;
int score;
public:
Stu(char *name1,int s);
~Stu();
};
Stu::Stu(char *name1,int s)
{
name=new char[strlen(name1)+1];
strcpy(name,name1);
score=s;
}
Stu::~Stu()
{
cout<<"d.........."<<name<<endl;
delete name;
}
int main()
{
Stu s1("Mr.zhang",90);
Stu s2=s1;
}
输出:
其中第二行是乱码,不同的运行,可以产生不同的结果。
分析:
第一,在创建第一个对象stu1时,调用构造函数,为stu1分配一片内存用来存stu1中的name。
第二,在创建第二个对象stu2时,没有调用构造函数,没有为stu2分配内存,调用了缺省的拷贝构造函数,stu1和stu2都指向了同一片内存。
第三,程序结束时,stu1的name释放,就是stu2中的name也就释放了。
二、深拷贝:就是显示的定义拷贝构造函数。
通常情况下,显示的拷贝构造函数就是为了解决这类带有指针类型的类的拷贝。它为要拷贝的对象分配了空间。
示例:
class Stu
{
private:
char *name;
int score;
public:
Stu(char *name1,int s);
~Stu();
Stu(Stu& stu1);
};
Stu::Stu(char *name1,int s)
{
name=new char[strlen(name1)+1];
strcpy(name,name1);
score=s;
}
Stu::Stu(Stu& stu1)
{
name=new char[strlen(name)+1];
strcpy(name,stu1.name);
score=stu1.score;
}
Stu::~Stu()
{
cout<<"d.........."<<name<<endl;
delete name;
}
int main()
{
Stu s1("Mr.zhang",90);
Stu s2=s1;
}
个人感觉:浅拷贝和深拷贝的区别在于是否都有独立的内存空间。
本文深入探讨了浅拷贝和深拷贝的概念,解释了它们之间的区别,并通过实例展示了如何在带有指针类型的类中使用深拷贝以避免数据丢失的问题。

被折叠的 条评论
为什么被折叠?



