8.4.1 实现重载的运算符(1)
为了给某个类实现重载的运算符,必须编写特殊的函数。假设在类定义内重载<运算符的函数是CBox类的成员,则该函数的声明如下所示:
- class CBox
- {
- public:
- bool operator<(const CBox& aBox) const; // Overloaded 'less than'
- // Rest of the class definition...
- };
这里的单词operator是个关键字。该关键字结合运算符符号或名称,本例中是<,将定义一个运算符函数。本例中的函数名是operator<()。在运算符函数的声明中,关键字operator和运算符之间有无空格都行,前提是没有歧义。歧义出现在运算符是名称而非符号的时候,如new或delete。如果写成不加空格的operatornew和operatordelete,则它们都是合法的普通函数名。因此,如果要编写这些运算符的运算符函数,则必须在关键字operator和运算符名称之间加个空格。重载运算符函数看起来最奇怪的函数名是operator()()。看起来似乎是输入错误,实则不然。事实上,它是重载函数调用运算符()的一个函数。注意,将operator<()函数声明为const,因为该函数不修改本类的数据成员。
在operator<()运算符函数中,运算符的右操作数由函数形参定义,左操作数由this指针隐式定义。因此,如果有下面这条if语句:
- if(box1 < box2)
- cout << endl << "box1 is less than box2";
则括号中的表达式将调用重载的运算符函数,它与下面这个函数调用等价:
- if(box1.operator<(box2))
- cout << endl << "box1 is less than box2";
表达式中的CBox对象与运算符函数形参之间的对应关系如图8-3所示。

下面介绍operator<()函数的工作原理:
- // Operator function for 'less than' which
- // compares volumes of CBox objects.
- bool CBox::operator < (const CBox & aBox) const
- {
- return this->Volume() < aBox.Volume();
- }
该函数使用引用形参,以避免调用时不必要的复制开销。因为该函数不需要修改调用它的对象,所以可将其声明为const。如果不这样做,则根本不能使用该运算符比较CBox类型的const对象。该函数也声明为const,是因为该函数不需要修改调用它的CBox对象。
return表达式使用成员函数Volume()计算this指向的CBox对象的体积,然后使用基本运算符<比较结果与对象aBox的体积。
对CBox对象进行相等比较也很容易实现:
- bool CBox::operator==(const CBox& aBox) const
- {
- return this->Volume() == aBox.Volume();
- }
如果两个对象的体积相同,这段代码就假定两个对象相等。也可以将相等定义为其他方式。相等比较的更严格、更现实的实现方法是对象有相同的尺寸,这留给读者来思考。