如果我手动重载结构体的
==
运算符,我是否可以免费获得 !=
运算符(大概定义为相反的布尔值),或者我是否必须手动重载它(即使只是 return !(this == rhs)
) ?
编辑-问题不是我是否可以重载两个运算符,而是如果我已经重载了相等运算符,我是否必须重载不等式。 无论如何,已经给出了很好的答案。
超载
operator ==
不会给你operator !=
。您必须手动执行此操作,规范的方法是按照 operator ==
来实现它,如 !(left == right)
。
运算符的语义不是由标准规定的。你可以很好地重载
operator ==
来表示相等,但又重载 operator !=
来表示不同的东西,例如加法甚至再次相等 (并不是说这是一个很好的做法,事实上应该不鼓励这样做。当有疑问时,请按照整数进行操作做...).[参考下面(1)]
顺便说一句,
Boost.Operators
可以帮助您为操作员提供规范的实现。还有 std::rel_ops
以及 operator !=
的规范实现。
(1) 要了解更多信息,请阅读 C++ 中运算符重载的三个基本规则。
没有什么是免费的。您需要为 C++ 中使用的内容付费(在运算符重载的情况下)。
你只会得到你重载的操作符。
另外,如果您重载
==
运算符,那么您也应该重载 !=
,这是一个很好的做法,因为您的班级的用户会期望它可用。
运算符重载 C++ FAQ 应该是一本好书。
回答更新的问题:
问题不在于我是否可以重载两个运算符,而是如果我已经重载了相等运算符,我是否必须重载不等式。
没有。
没有这样的要求:如果您需要超载!=
,则
必须超载
==
。然而,“应该”重载彼此“相关”的运算符是一个很好的做法。
为什么这是一个好的做法?
从你的班级用户的角度来思考。如果你的类的用户可以使用==
(平等标准)来比较你的类的对象,他们自然会期望他们也应该能够使用!=
(非平等标准),这源于事实上,这两个运算符密切相关并且所有内置类型都受支持。
如果你忽略
should
并且不超载!=
,当你超载
==
时会发生什么?
如果您班级的用户使用 !=
,他们将收到编译错误。
当他们获得 !=
时,他们会对没有获得
==
==
而不是 !=
。 所以你可以忍受它,但要准备好迎接一些皱眉和抱怨不便以及不提供用户友好界面的情况。
你必须让每个操作员超载。 != 和 == 没有链接。
事实并非如此,幸好事情就是这样。例如,您可能需要一个结构,其中 a!=b 和 a==a 都为 true。它们不一定是相反的,它们可以是您想要的任何东西。
operator ==
将“得到你!=”,从某种意义上说,您可以使用该运算符,并且它将根据
operator ==
来实现。 结果简直是颠倒了。
如果结果并非严格与operator !=
相反,您仍然可以选择实施operator ==
,或者您可以
= delete
如果您想明确禁止其使用。