系统中有默认的赋值函数,若类的数据成员中有指针,则需要程序员自己写一个赋值运算符重载,让两个对象里的指针指向两个不同的内存单元中,防止在函数结束时调用析构函数,释放同一块空间,触发异常中断。
步骤思想:
1.判断是否为自赋值,自赋值直接返回本身
2.先释放左值对象原有的空间
3.再给左值对象开辟一个和右值对象同样大小的空间
4.将右值对象所指向的空间里的内容复制给左值对象所指向空间
5.引用返回
//赋值运算符重载代码
class A
{
public:
A(const char* name = "\0")
{
m_name = new char[strlen(name) + 1];
strcpy_s(m_name,strlen(name)+1, name);
}
void Printf()
{
cout << "name " << m_name << endl;
}
A& operator=(const A& b)//将对象b加上const,是为了提高健壮性,b给a赋值,b不能被改变
{
if (this == &b)//判断是否存在自己给自己赋值的情况,如a=a
{
return *this;//直接返回自己本身,节省时间
}
delete[]m_name;
m_name = new char[strlen(b.m_name) + 1];
strcpy_s(m_name, strlen(b.m_name) + 1, b.m_name);
return *this;
}
~A()
{
delete[]m_name;
m_name = NULL;
}
private:
char* m_name;
};
int main()
{
A a("baobao");//调用构造函数
A b("pangpang");
a.Printf();
b.Printf();
b=a;//将a赋值给b
b.Printf();
}
运行结果: