C++如何定义拷贝构造函数?有哪些注意的地方?

C++如何定义拷贝构造函数?有哪些注意的地方?自定义拷贝构造函数 C 为定义的类提供了默认的拷贝构造函数 那么 我们是否还需要自定义拷贝构造函数 首先 来看看下面的一个例子 程序测试代码如下 程序运行结果如下 在这个程序中 我们使用 new 关键字来动态构建一个 student 对象 并设置给

欢迎大家来到IT世界,在知识的湖畔探索吧!

自定义拷贝构造函数

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

C++如何定义拷贝构造函数?有哪些注意的地方?

欢迎大家来到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类中自定义拷贝构造函数,对涉及到指针类型的成员进行特殊处理,重新申请内存,再拷贝赋值的数据。程序测试例子如下:

C++如何定义拷贝构造函数?有哪些注意的地方?

C++如何定义拷贝构造函数?有哪些注意的地方?

可以看到,能够成功复制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

(0)
上一篇 2天前
下一篇 2天前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信