对于普通的数据类型函数,编译器知道该如何运算,但是对于自定义数据类型,编译器无法进行赋值,于是我们可以用到重载。
首先,系统会默认给一个类 创建至少三个函数 默认构造、析构、拷贝构造(简单值拷贝)。
若存在堆区代码,系统提供的值拷贝内存被重复释放会报错。所以需要用到深拷贝来解决这个问题。
class Person
{
public:
Person(char* name, int age)
{
this->m_Name = new char[strlen(name) + 1];
strcpy(this->m_Name, name);
this->m_Age = age;
}
Person&operator=(const Person& p)
{
//先判断原来的堆区是否有数据 如果有先释放
if (this->m_Name != NULL)
{
delete[]this->m_Name;
this->m_Name = NULL;
}
this->m_Name = new char[strlen(p.m_Name) + 1];
strcpy(this->m_Name, p.m_Name);
this->m_Age = p.m_Age;
return *this;
}
~Person()
{
if(this->m_Name!=NULL)
{
delete[]this->m_Name ;
this->m_Name = NULL;
}
}
char* m_Name;
int m_Age;
};
void test01()
{
Person p1("Tom", 18);
Person p2("Jerry", 19);
p1 = p2;
cout << "p1的姓名:" << p1.m_Name << "年龄:" << p1.m_Age << endl;
cout << "p2的姓名:" << p2.m_Name << "年龄:" << p2.m_Age << endl;
Person p3("", 0);
p3 = p1 = p2;
cout << "p3的姓名:" << p3.m_Name << "年龄:" << p3.m_Age << endl;
}