黑夜的狼

沮丧吗,那就是一种无病呻吟!留恋它就是一种高度近视!目光应该放得更远一点! 别不想飞,只是要一步跨过太平洋!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
Code

由于p1在建立时,调用的构造函数里给数据成员分配了堆空间

所以在p2建立时,调用了默认拷贝构造函数,拷贝了p1.pName,此时p1.pName已经指向了一个堆地址

所以p2.pName指向了和p1.pName一样的地址,在p2,p1的析构函数先后调用时,p1的析构函数打印的将是"Destructing"+随机数,

并且运行到delete pName时报错,因为这个空间已经在p2析构时释放了。

所以在构造函数里有分配空间的操作,定要显示给个拷贝构造函数让它不紧拷贝成员也拷贝资源

拷贝构造函数格式为

Person(Person&p)
{
//}

如果你的类需要一个析构函数来释放资源,就需要一个深拷贝构造函数(未拷贝资源的称为浅拷贝)

还有c++编译器给我们的构造函数附加了个有趣功能-----试探性的类型转换

class T
{
    
public T(char *)
    {
//..};
}

void fn(T &t)
{
//..}

void main()
{
    fn(
"Anncesky");
}

 fn("Anncesky");当然会先去找 fn(char *)的声明的函数,找了一遍,发现没有,唉,正在叹气呢,万绿丛中一点红啊

发现了fn(T &t);虽然参数类型不匹配,还没绝望,假如万一可能也许

T类型的构造函数的参数只有一个,并且类型是char *

我就成全这串狗字符串吧,于是在编译器的打扮下,"Anncesky" 变成了 T("Anncesky")----无名对象 传递给fn

posted on 2009-06-18 22:47  anncesky  阅读(309)  评论(0编辑  收藏  举报