设为首页 加入收藏

TOP

8.4.1 实现重载的运算符(1)
2013-10-07 16:08:01 来源: 作者: 【 】 浏览:57
Tags:8.4.1 实现 重载 运算

8.4.1  实现重载的运算符(1)

为了给某个类实现重载的运算符,必须编写特殊的函数。假设在类定义内重载<运算符的函数是CBox类的成员,则该函数的声明如下所示:

  1. class CBox  
  2. {  
  3. public:  
  4. bool operator<(const CBox& aBox) const;                 // Overloaded 'less than'  
  5. // Rest of the class definition...  
  6. };  

这里的单词operator是个关键字。该关键字结合运算符符号或名称,本例中是<,将定义一个运算符函数。本例中的函数名是operator<()。在运算符函数的声明中,关键字operator和运算符之间有无空格都行,前提是没有歧义。歧义出现在运算符是名称而非符号的时候,如new或delete。如果写成不加空格的operatornew和operatordelete,则它们都是合法的普通函数名。因此,如果要编写这些运算符的运算符函数,则必须在关键字operator和运算符名称之间加个空格。重载运算符函数看起来最奇怪的函数名是operator()()。看起来似乎是输入错误,实则不然。事实上,它是重载函数调用运算符()的一个函数。注意,将operator<()函数声明为const,因为该函数不修改本类的数据成员。

在operator<()运算符函数中,运算符的右操作数由函数形参定义,左操作数由this指针隐式定义。因此,如果有下面这条if语句:

  1. if(box1 < box2)  
  2. cout << endl << "box1 is less than box2";  

则括号中的表达式将调用重载的运算符函数,它与下面这个函数调用等价:

  1. if(box1.operator<(box2))  
  2. cout << endl << "box1 is less than box2"; 

表达式中的CBox对象与运算符函数形参之间的对应关系如图8-3所示。

下面介绍operator<()函数的工作原理:

  1. // Operator function for 'less than' which  
  2. // compares volumes of CBox objects.  
  3. bool CBox::operator < (const CBox & aBox) const  
  4. {  
  5. return this->Volume() < aBox.Volume();  
  6. }  

该函数使用引用形参,以避免调用时不必要的复制开销。因为该函数不需要修改调用它的对象,所以可将其声明为const。如果不这样做,则根本不能使用该运算符比较CBox类型的const对象。该函数也声明为const,是因为该函数不需要修改调用它的CBox对象。

return表达式使用成员函数Volume()计算this指向的CBox对象的体积,然后使用基本运算符<比较结果与对象aBox的体积。

对CBox对象进行相等比较也很容易实现:

  1. bool CBox::operator==(const CBox& aBox) const  
  2. {  
  3. return this->Volume() == aBox.Volume();  
  4. }  

如果两个对象的体积相同,这段代码就假定两个对象相等。也可以将相等定义为其他方式。相等比较的更严格、更现实的实现方法是对象有相同的尺寸,这留给读者来思考。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇8.4 运算符重载 下一篇8.4.1 实现重载的运算符(2)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·python数据分析岗的 (2025-12-25 10:02:21)
·python做数据分析需 (2025-12-25 10:02:19)
·成为一个优秀的pytho (2025-12-25 10:02:16)
·Java后端面试实习自 (2025-12-25 09:24:21)
·Java LTS版本有哪些 (2025-12-25 09:24:18)