上一个随笔我讲了深浅拷贝的问题,也提到了operator=这个方法,那这个方法什么时候用会出现问题呢,上一个随笔是通过拷贝狗仔Person p2(p1)来赋值,那我如果想直接赋值p1=p2呢?
如果不是堆区的数据的话,那很简单,直接把p2所有的属性值赋值到p1的所有的属性上.那如果数据是堆区呢?那是不是又出现了两个对象指向同一个地址的,导致内存重复释放的问题!
所以这是后要重写operator=这个方法,为新对象重新开辟内存。
所以,一般来说这个重写operator=方法和重写拷贝构造函数时一起的
重写拷贝构造就是:正常数据重新赋值,为堆区数据重新开辟大小相等的内存
重写operator=就是:比重写拷贝构造多了判断之前的堆区是否有数据,有数据的话要清空(为什么要清空?)
例如
Person p1(18);
Person p2(20);
p1=p2;
因为赋值之前p1内有数据,所以要把它清空再赋值
而拷贝构造Person p2(p1),此时的p2还没有数据,所以不需要清空