【问题标题】:Is using the overloading of one operator to overload another a good practice?使用一个运算符的重载来重载另一个运算符是一种好习惯吗?
【发布时间】:2015-07-23 03:13:43
【问题描述】:

我最近发现了 C++ 的奇妙功能,它允许程序员在他们创建的类上重载操作。作为冒险进入这个主题的一种方式,我决定尝试制作自己的vector 课程。

为了满足我的好奇心,我最近做了以下事情来重载我的类的相等运算符:

 95 bool Vect::operator==(const Vect& rhs){
 96     return this->getCoord() == rhs.getCoord()
 98 }
 99 
100 bool Vect::operator!=(const Vect& rhs){
101     return !(*this == rhs);
102 }

这编译并正常工作。但是,我有一个关于这是否是好/坏做法(以及为什么!)的问题。如果它是一个坏的,我不想养成这样做的习惯,或者如果它是一个好的,我鼓励自己继续使用它。

【问题讨论】:

  • 您正在正确使用该功能。如果不好,可能不提供。运算符可以以多种方式使用,代码变得优雅。它允许比较/操作您自己的专业方式。
  • 如果operator== 更复杂怎么办?你想通过重写== 来实现operator != 并且在试图找出逆时可能会出错吗?信不信由你,我确实看到代码写在(天真的)程序员坐下来尝试通过将==“从里到外”来编写!=的地方,而所需要做的只是放置一个!字符.
  • DRY 原则会坚持这是一个好的做法。多次编写相同的逻辑可能会引入新的错误,如果您需要更改该逻辑,则无需猜测您实现它的所有位置。你做得很好!
  • 同样,其他关系运算符也是如此。您需要“完整代码”的唯一关系运算符是==<。所有其他关系运算符(<=>!=>=)都可以从这两者派生。
  • 您可以考虑将这些运算符实现为non-member, non-friend functions

标签: c++ operator-overloading


【解决方案1】:

运算符重载没有什么不好,这是一个很好的做法。

Operator overloading 帮助您编写干净且易于理解的代码,并使编辑过程更轻松。

PS:正如您所说,您最近遇到了operator overloadingthis 可能会帮助您了解它的一些规则和限制。

编辑: 使用重载运算符来重载其他运算符是可以的。但是它进行了两次函数调用而不是一次,考虑到性能,这是不可取的。不过影响不大。

【讨论】:

  • 感谢您的帖子。但是,我知道运算符重载是一种有用的做法,但是我要询问的是,是否将重载运算符用于一个运算符(在本例中为“==”)来定义另一个运算符(“!=”)是否很好实践。感谢您的参考。
  • 然而,另一方面,我不确定我是否应该接受这个作为答案?它没有解决我的问题,但它是给出的唯一“答案”(当然除了 cmets,我不能接受)。我应该不回答这个问题吗?
  • 我的错!我误解了这个问题。我已经在我的答案中进行了编辑。接受答案是您的电话,如果有帮助,请接受或不接受。
  • 绝对没有问题——我们都会犯错误,无论是在编程还是在 SO 上。我会接受这个答案,因为它非常简洁彻底地回答了这个问题,并且还包括对实践的警告。
猜你喜欢
  • 2020-08-19
  • 2017-09-18
  • 2012-01-03
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
相关资源
最近更新 更多