今天我们来讲一下运算符的重载。
运算符重载(Overloading operator)其实也是一种函数的调用方式。
运算符重载说白了就是我们赋予原来的运算符新的计算方式,
只不过这个方式要根据上下文来判定,这部分编译器会自动给我们做好。
运算符重载的格式:
type operator@(type) //@代表要重载的运算符
{ //函数体
}
可以重载的运算符有一下这些:
今天我们从+号开始。
下面我们举例说明:
/****************************************************
* brief : +运算符重载
* author : shao
* date : 2020-03-10
* note : none
*
****************************************************/
#include <iostream>
using namespace std;
class Person{
/*设置全局函数为*/
//friend Person operator+(Person &p1, Person &p2);
public:
Person()
{
this->p_age = 10;
this->p_ID = 10;
}
Person(int age, int ID)
{
this->p_age = age;
this->p_ID = ID;
}
Person operator+(Person &p);
//private:
int p_age;
int p_ID;
};
/*成员函数重载+*/
Person Person::operator+(Person &p)
{
this->p_age += p.p_age;
this->p_ID += p.p_ID;
return *this; //返回的是自身
}
//这里我们把全局重载+函数注释掉,否则编译的时候会出现二义性。
/* 全局函数重载+ */
//Person operator+ (Person &p1, Person &p2)
//{
// Person temp;
//
// temp.p_age = p1.p_age + p2.p_age;
// temp.p_ID = p1.p_ID + p2.p_ID;
//
// return temp;
//}
/*全局函数重载+*/
Person operator+ (Person &p1, int a)
{
Person temp;
temp.p_age = p1.p_age + a;
temp.p_ID = p1.p_ID + a;
return temp;
}
void test01(void)
{
Person p1;
Person p2(5,2);
Person p3 = p1 + p2;
cout << "p3.p_age = " << p3.p_age << endl;
cout << "p3.p_ID = " << p3.p_ID << endl;
Person p4;
p4 = p2+p1;
cout << "p4.p_age = " << p4.p_age << endl;
cout << "p4.p_ID = " << p4.p_ID << endl;
p4 = p4 + 10;
cout << "p4.p_age = " << p4.p_age << endl;
cout << "p4.p_ID = " << p4.p_ID << endl;
}
int main(void)
{
test01();
return 0;
}
结果如下:
我们可以看到,
原本的计算方式只有基本类型的+。
现在我们重载后可以实现对类对象的+。这就是重载后让我们的计算变的更加方便。
实际重载函数也是函数,那么函数之间还可以重载。
就是code中的,
Person operator+ (Person &p1, int a) ;
Person operator+ (Person &p1, Person &p2) ;
这两个函数是相互重载的。