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!
|
您将承担一切因您的行为、言论而直接或间接导致的民事或刑事法律责任
留言板管理人员有权保留或删除其管辖留言中的任意内容 本站提醒:不要进行人身攻击。谢谢配合。 |