C++编译器至少给一个类添加4个函数:
- 默认构造函数(无参,函数体为空)
- 默认析构函数(无参,函数体为空)
- 默认拷贝构造函数,对属性进行值拷贝
- 赋值运算符 operator=, 对属性进行值拷贝
如果类中有属性指向堆区,做赋值操作的时候也会出现深浅拷贝的问题。
具体示例代码如下:
#include<iostream>
using namespace std;
class Person
{
public:
Person(int age)
{
//在堆区开辟空间
m_Age = new int(age);
}
//重载赋值运算符
Person & operator=(Person &p)
{
//先判断是否为空
if (m_Age != NULL)
{
delete m_Age;
m_Age = NULL;
}
//提供深拷贝 解决浅拷贝的问题
m_Age = new int(*p.m_Age);
return *this;
}
~Person()
{
//写了析构函数后,P1调用完后会释放m_Age的空间,调用P2时候进行赋值操作时,重复释放,会造成系统崩溃
if (m_Age != NULL)
{
delete m_Age;
m_Age = NULL;
}
}
//重载 赋值运算符
int *m_Age;
};
void test()
{
Person p1(18);
Person p2(20);
Person p3(50);
p3 = p2 = p1;
cout << "p1的年龄为:" << *p1.m_Age << endl;
cout << "p2的年龄为:" << *p2.m_Age << endl;
cout << "p3的年龄为:" << *p3.m_Age << endl;
}
int main()
{
test();
system("pause");
return 0;
}