重载=
一般用于解决浅拷贝问题:
#include <iostream>
using namespace std;
class person
{
public:
person(int a)
{
m_a= new int(5);
}
~person()
{
if (m_a != NULL)
{
delete m_a;
m_a = NULL;
}
}
int *m_a;
};
int main()
{
person p(10);
person p1(20);
p1 = p;
}
这段代码会崩掉,但是并不会报错,问题就出现在了浅拷贝,因为编译器提供的拷贝直接将p中m_a的地址赋值给了p1中m_a,那么就会出现重复释放和产生悬空指针的两个问题。
如何解决。
方案一:修改拷贝构造函数
方案二:对=进行重载
方案一在前面的文章有所提及,今天具体讲讲方案2。
#include <iostream>
using namespace std;
class person
{
public:
person & operator=(person &p)
{
//应该先判断是否有属性在堆区,释放干净后,再深拷贝
if (m_a != NULL)
{
delete m_a;
m_a = NULL;
}
m_a = new int(*p.m_a);
return *this;
}
person(int a)
{
m_a= new int(5);
}
~person()
{
if (m_a != NULL)
{
delete m_a;
m_a = NULL;
}
}
int *m_a;
};
int main()
{
person p(10);
person p1(20);
person p2(30);
p2=p1 = p;
cout << *p1.m_a <<" "<< *p.m_a <<" "<< *p2.m_a;
}
这是正确的代码,注意了,如果我们这里改成这样:
void operator=(person &p)
{
if (m_a != NULL)
{
delete m_a;
m_a = NULL;
}
m_a = new int(*p.m_a);
}
那么就不能进行p2=p1 = p这一步操作,为什么?
因为我们p1=p执行后我们没有返回值!所以我们不能再进行对用p1=p后再对p2赋值!所以我们应该返回*this。