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++自定义拷贝构造函数的主要内容,如果未能解决你的问题,请参考以下文章