【发布时间】: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。