浅层复制构造函数会产生迷途指针,进而造成程序崩溃,所以,我们需要用深层复制构造函数来解决这个问题
#include <iostream>
using namespace std;
class A
{
public:
A() { x = new int; *x = 5; }
~A() { delete x; x = NULL; } //删除指针后,紧接着就要把指针设置为 NULL,养成这样的习惯
A(const A&a) //深层复制构造函数
{
cout << "复制构造函数执行...\n" << endl;
x = new int; //为成员变量创建一个新的内存(堆)区域
//x是在堆中有别于原指针的新的空间,所以原对象被删除,不影响复制出来的新对象
*x = *(a.x); //把旧对象内容赋值给新的对象
/*深层复制构造函数有别于浅层复制构造函数,在于一:复制构造函数为新的指针成员变量提供新的内存空间(可以是堆,也可以是栈),同时把指针成员变量的值赋给新的指针,作为新的指针所指向地址的内容*/
}
void print()const { cout << *x << endl; }
void set(int i) { *x = i; }
private:
int *x;
};
int main()
{
A *a = new A();
cout << "a:";
a->print();
A b = (*a); //在栈中复制一个a的对象 b
cout << "a:";
a->print();
cout << "b:";
b.print();
a->set(998);
b.set(43);
a->print();
b.print();
A *c = new A(*a); //在堆中复制一个a的对象c
c->set(76);
c->print();
delete c;
delete a;
system("pause");
return 0;
}