运算符重载概念:对已有的运算符进行重新定义,赋予其另一种功能,以适应不同的数据类型
c++编译器至少给一个类添加4个函数
1.默认构造函数(无参,函数体为空)
2.默认析构函数(无参,函数体为空)
3.默认拷贝构造函数.对属性进行拷贝。
4.赋值运算符operator=,对属性进值只拷贝
如果类中有属性指向堆区,做赋值操作时也会出现深拷贝问题。
重载一个函数的条件是:该函数必须在参数的参数个数和参数类型上与其他同名函数所相同。
示例:
#include<iostream>
using namespace std;
class Person
{
public:
Person(int age)
{
m_Age = new int(age);
}
//赋值运算符重载
Person& operator=(Person& p)//这里的类型必须加上引用类型
{
//编译器提供的浅拷贝
//m_Age=p.m_Age; //这样操作会造成两个指针共用一个内存空间。
//应该先判断是否有属性在堆区,如果有先释放干净,在进行深拷贝。
if(m_Age!=NULL)
{
delete m_Age;
m_Age=NULL;
}
//深拷贝。
m_Age= new int(*p.m_Age);
//返回对象本身。
return *this;
}
~Person()
{
if(m_Age!=NULL)
{
delete m_Age;
m_Age=NULL;
}
}
int *m_Age;
};
void show()
{
Person p1(18);
Person p2(20);
Person p3(30);
p3=p2=p1;
cout<<"p1 ="<<*p1.m_Age<<endl;
cout<<"p2 ="<<*p2.m_Age<<endl;
cout<<"p3 ="<<*p3.m_Age<<endl;
}
int main()
{
show();
return 0;
}