C++自定义拷贝构造函数

Posted LC编程开发者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++自定义拷贝构造函数相关的知识,希望对你有一定的参考价值。

C++为定义的类提供了默认的拷贝构造函数,那么,我们是否还需要自定义拷贝构造函数?首先,来看看下面的一个例子,程序测试代码如下:

       程序运行结果如下:

       在这个程序中,我们使用new关键字来动态构建一个student对象,并设置给ps指针对

象。然后,执行:

student stud(*ps);

       此时,使用ps指针指向的对象来复制,复制得到stud对象。那么,由于C++没有定义拷贝构造函数,所以,使用系统默认的拷贝构造函数。

       最后,执行stud.print();函数,输出stud对象的信息是异常的。产生这个问题的原因是系统的默认拷贝构造函数,当执行:

student stud(*ps);

       此时,调用系统的默认拷贝构造函数,相当于:

stud.name = ps->name;

stud.addr = ps->addr;

stud.number = ps->number;

       那么,当调用delete ps;语句时,销毁ps指向的对象。此时,在析构函数中把ps->name, ps->addr成员进行销毁。那么,就导致stud.name, stud.addr成员的指针地址被销毁,最终,输出stud.name, stud.addr的值是异常的信息。

       那么,要解决这个问题,就需要在student类中自定义拷贝构造函数,对涉及到指针类型的成员进行特殊处理,重新申请内存,再拷贝赋值的数据。程序测试例子如下:

       程序运行结果如下:

       可以看到,能够成功复制stud对象,输出stud对象的信息是正常。因为我们增加了拷贝构造函数,函数定义如下:

    student (const student& s)

        cout << "copy construct func" << endl;

        name = new char[32];

        strcpy(name, s.name);

        addr = new char[32];

        strcpy(addr, s.addr);

        number = s.number;

   

       在该拷贝构造函数中,我们对指针类型的成员变量进行“申请内存”,然后,再拷贝数据。那么,复制的stud对象就与参数s引用对象没有任何联系了。当引用对象s销毁的时候,对stud对象没有任何影响。这就是拷贝构造函数的作用。让我们在复制对象的时候,可以操作对象深度复制。

韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发,微信:13926572996,QQ:1523520001,博客:www.mylinux.vip

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以上是关于C++自定义拷贝构造函数的主要内容,如果未能解决你的问题,请参考以下文章

c++中深拷贝和浅拷贝问题

C++中的复制构造函数

C++深拷贝和浅拷贝细节理解

构造函数的调用规则

c++拷贝构造函数

关于C++默认拷贝构造函数