胸怀天下 脚踏实地  

 #include <iostream.h>
#include <string.h>

class Person{
public:
  Person(char* pN)
  {
    cout <<"Constructing " <<pN <<endl;
    pName=new char[strlen(pN)+1];
    if(pName!=0)
      strcpy(pName,pN);
  }

  ~Person()
  {
    cout <<"Destructing " <<pName <<endl;
    pName[0]='\0';
    delete pName;
  }
  char* pName;
};

void main()
{
  Person p1("Randy");
  Person p2=p1;       //即Person p2(p1);
  cout<<hex<<(void *)p1.pName<<"   "<<(void *)p1.pName<<endl;
}
由于p1在建立时,调用的构造函数里给数据成员分配了堆空间所以在p2建立时,调用了默认拷贝构造函数,拷贝了p1.pName,此时p1.pName已经指向了一个堆地址所以p2.pName指向了和p1.pName一样的地址,在p2,p1的析构函数先后调用时,p1的析构函数打印的将是"Destructing"+随机数,并且运行到delete pName时报错,因为这个空间已经在p2析构时释放了。所以在构造函数里有分配空间的操作,定要显示给个拷贝构造函数让它不紧拷贝成员也拷贝资源拷贝构造函数格式为  

 Person(Person&p)
{//}


posted on 2009-06-19 21:55  icey  阅读(207)  评论(0编辑  收藏  举报