//对浅层复制存在的问题的解决方案是针对两个对象,成员指针所指向的区域应当利用明确定义的
//复制构造函数分别为他们申请堆空间,确保他们的地址不同,然后再复制值
//这样的方案可以避免本例中存在的错误,所以应用的技术是深层复制
#include <iostream>
using namespace std;
class demo
{
public:
demo()
{
int * pa = new int;
*pa = 5;
cout << "Orignal constructor running...\t";
cout << "pa:" << pa << endl;
}
demo(const demo & tmp)
{
cout << "Copy constructor running...\t";
//下面两条语句是解决方案的关键
pa = new int;
*pa = *(tmp.pa);
cout << "pa:" << pa << endl;
}
~demo()
{
delete pa;
pa = NULL;
cout << "Destructor running...\n";
}
int print()const{return *pa;}
void set(int a){*pa = a;}
private:
int * pa;
};
int main()
{
demo * pfa = new demo();
cout << "pfa->" << pfa->print() << endl;
demo fb(*pfa);
fb.print();
//用下面的语句验证这种错误的指针用法
cout << "\n>>>Set it's data again, and check it again!\n";
fb.set(12);
cout << "pfa->" << pfa->print() << endl;
cout << "fb->" << fb.print() << endl;
delete pfa;
return 0;
}