考试网 >> IT认证 >> 水平 >> 程序员 >> 谈谈c++的初始化工作(下)

谈谈c++的初始化工作(下)

发布时间:2006-06-28 02:36     点击:
分页:上一页  1 2 3 [4] 5 6  下一页

#include

#include "human.h"

void main()

{

//测试程序

try{

Human lily(11100120,"lily");

Human lucy=lily;

}

catch(...)

{//如果有any异常

std::cout<<" Unknown Exception... ";

}

}

//请回头看程序,您觉得一切都好吗?



事实上,调试过程中,等三个异常忽略后,就会得到下面的结果:

/*

After three exceptions occured you get :

Unknown Exception...

Press any key to continue

*/

为什么?

看这几行代码:

Human lily(11100120,"lily");

Human lucy=lily;

虽然一开始,我就给了小例子,形式一样,那个没问题。何以这个就不行了呢?因为类的定义不同。

由c++工作的机理,这行

Human lucy=lily;

是把lily的资源拷贝给lucy(lucy是不调用构造函数的),可是,因为其中的name是用户申请的资源,并不能把它也拷贝过去,而是直接传了地址。这样,您知道吗,lucy.name和lily.name的地址是一样的。

于是,当一个的析构函数调用后,name所指向的资源已被释放掉了的。而另外一个类的析构函数又去释放,问题来了---程序崩溃了!

这就是浅拷贝问题---“浅”的不完全的拷贝:)。

找到原因,我们就办法。解决的办法是,这份工作自己来做!

写一个拷贝赋值操作(public):

形式为: className &operator=(className &obj){ /*...*/}

您看下面的解决办法和结果:

/*

If you add ...in class Human(public):

Human &operator=(Human &human){

if(this!=&human){

ID=human.getID();

name=new Name(human.getName()->getName());

return *this;

}

}

OK,and you get:

Press any key to continue

That is what we want!

分页:上一页  1 2 3 [4] 5 6  下一页
版权申明:未经书面授权请勿转载本站信息!!作品版权归所属媒体与作者所有!!
发表评论: 匿名发表 用户名: 查看评论
您将承担一切因您的行为、言论而直接或间接导致的民事或刑事法律责任
留言板管理人员有权保留或删除其管辖留言中的任意内容
本站提醒:不要进行人身攻击。谢谢配合。
在本站搜索相关信息
2003-2005 Ksw123.com All Rights Reserved. - TOP
Copyright © 2006 Ksw123.com. All rights reserved.中国考题网 版权所有