operator是c++中的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名.
这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要是运算符的使用方法与原来的一致,另一方面扩展功能只能通过函数的方式(C++中,"功能都是由函数是实现的").
一、为什么使用操作符重载?
比如判断两个人是否一样大,我们默认用年龄,所以在设计person的这个class的时候,我们要考虑操作符==,而且比较的应该是age.那么为什么叫做重载呢?这是因为,在编译器实现的时候,已经为我们提供了这个操作符的基本数据类型实现版本,但是现在他的操作数变成了用户定义的数据类型class,所以需要我们来提供该函数的实现.
二.如何实现一个重载的操作符呢?
A:操作符重载实现为类成员函数
重载的操作符在类体重被声明,声明方式如同普通成员函数一样,只不过他的名字包含关键字operator,以及紧跟其后的一个c++预定义的操作符.
如下方式声明一个预定义的==操作符:
class person{
private:
int age;
public:
person(int a){
this->age=a;
}
inline bool operator == (const person &ps) const;
};
实现方式如下:
inline bool person::operator==(const person &ps)const
{
if(this->age==ps.age)
return true;
return false;
}
调用方式如下:
#include <iosream>
using namespace std;
int main()
{
person p1(10);
person p2(20);
if(p1==p2) cout<<”the age is equal!”< return 0;
}
这里,因为operator ==是class person的一个成员函数,所以对象p1,p2都可以调用该函数,上面的if语句中,相当于p1调用函数==,把p2作为该函数的一个参数传递给该函数,从而实现了两个对象的比较。
B:操作符重载实现为非类成员函数(全局函数)
对于全局重载操作符,代表左操作数的参数必须被显式指定。例如:
#include <iostream> using namespace std; class person{ public: int age; public: }; bool operator==(person const &p1,person const &p2) { if(p1.age=p2.age) return true; return false; } int main() { person rose; person jack; rose.age=18; jack.age=23; if(jack==rose) cout<<"ok"<return 0; }
1.如果一个重载操作符是类成员,那么只有当与他一起使用的左操作数是该类的对象时,该操作符才会被调用,如果该操作符的左操作数必须是其他类型,则操作符必须被重载成全局名字空间的成员.
2.c++要求赋值=,下标[],调用(),和成员指向->操作符必须被定义为类成员操作符.任何把这些操作符定义为名字空间成员的定义都会被标记为编译时刻错误.
3.如果有一个操作数是类类型如string类的情形那么对于对称操作符比如等于操作符,最好定义为全局名字空间成员.