//对浅层复制存在的问题的解决方案是针对两个对象,成员指针所指向的区域应当利用明确定义的
//复制构造函数分别为他们申请堆空间,确保他们的地址不同,然后再复制值
//这样的方案可以避免本例中存在的错误,所以应用的技术是深层复制
#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;
}