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");
}
{
public T(char *)
{//..};
}
void fn(T &t)
{//..}
void main()
{
fn("Anncesky");
}
fn("Anncesky");当然会先去找 fn(char *)的声明的函数,找了一遍,发现没有,唉,正在叹气呢,万绿丛中一点红啊
发现了fn(T &t);虽然参数类型不匹配,还没绝望,假如万一可能也许
T类型的构造函数的参数只有一个,并且类型是char *
我就成全这串狗字符串吧,于是在编译器的打扮下,"Anncesky" 变成了 T("Anncesky")----无名对象 传递给fn
玩技术,要学会忍受寂寞--