C++之浅拷贝和深拷贝

来源:互联网 发布:excel数据有效性公式 编辑:程序博客网 时间:2024/05/29 04:36

一、浅拷贝:就是有缺省的拷贝构造函数所实现的数据成员逐一赋值。

通常情况下,缺省的拷贝构造函数是可以胜任工作的。但是,如果数据成员中有指针类型,就会发生错误。

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



个人感觉:浅拷贝和深拷贝的区别在于是否都有独立的内存空间。

原创粉丝点击