运算符重载

  • 输入输出运算符:输入输出运算符必须是非成员函数,一般将其声明为友元。输入运算符必须处理输入可能失败的情况,输出则不需要。
  • 算数和关系运算符:关系运算符中的一个应该把工作委托给另一个,如果一个类在逻辑上有相等性的含义,则该类应该定义operator==;由于很多工作可以委托给另外一个运算符,可以写一个通用的类来定义其他的运算符,减少代码量(参考boost/operator.hpp),如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
template <typename T>
struct less_than_comparable
{
friend bool operator>(const T& a, const T& b)
{
return !(a <= b);
}
friend bool operator>=(const T& a, const T& b)
{
return !(a < b);
}
friend bool operator<=(const T& a, const T& b)
{
return (a < b) || (a == b);
}
};

class point : less_than_comparable<point>
{
private:
int x;
int y;
public:
point(int _x, int _y) :x(_x), y(_y){}
friend bool operator<(const point& p1, const point& p2)
{
return p1.distance() < p2.distance();
}
friend bool operator==(const point& p1, const point& p2)
{
return p1.distance() == p2.distance();
}
double distance() const
{

return sqrt(x * x + y * y);
}
};