欢迎大家来到IT世界,在知识的湖畔探索吧!
自定义拷贝构造函数
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对象没有任何影响。这就是拷贝构造函数的作用。让我们在复制对象的时候,可以操作对象深度复制。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/105163.html