重载 '==' 会得到 '!=' 吗?

问题描述 投票:0回答:5

如果我手动重载结构体的

==
运算符,我是否可以免费获得
!=
运算符(大概定义为相反的布尔值),或者我是否必须手动重载它(即使只是
return !(this == rhs)
) ?

编辑-问题不是我是否可以重载两个运算符,而是如果我已经重载了相等运算符,我是否必须重载不等式。 无论如何,已经给出了很好的答案。

c++
5个回答
76
投票

超载

operator ==
不会给你
operator !=
。您必须手动执行此操作,规范的方法是按照
operator ==
来实现它,如
!(left == right)

运算符的语义不是由标准规定的。你可以很好地重载

operator ==
来表示相等,但又重载
operator !=
来表示不同的东西,例如加法甚至再次相等 (并不是说这是一个很好的做法,事实上应该不鼓励这样做。当有疑问时,请按照整数进行操作做...).[参考下面(1)]

顺便说一句,

Boost.Operators
可以帮助您为操作员提供规范的实现。还有
std::rel_ops
以及
operator !=
的规范实现。

(1) 要了解更多信息,请阅读 C++ 中运算符重载的三个基本规则。


18
投票

没有什么是免费的。您需要为 C++ 中使用的内容付费(在运算符重载的情况下)。
你只会得到你重载的操作符。

另外,如果您重载

==
运算符,那么您也应该重载
!=
,这是一个很好的做法,因为您的班级的用户会期望它可用。

运算符重载 C++ FAQ 应该是一本好书。


回答更新的问题:

问题不在于我是否可以重载两个运算符,而是如果我已经重载了相等运算符,我是否必须重载不等式。

没有。
没有这样的要求:如果您需要超载!=,则

必须
超载
==
。然而,“应该”重载彼此“相关”的运算符是一个很好的做法。 为什么这是一个好的做法?

从你的班级用户的角度来思考。如果你的类的用户可以使用

==(平等标准)来比较你的类的对象,他们自然会期望他们也应该能够使用!=
(非平等标准),这源于事实上,这两个运算符密切相关并且所有内置类型都受支持。


如果你忽略
should

并且不超载

!=,当你超载

==
时会发生什么?

如果您班级的用户使用 
!=
,他们将收到编译错误。
当他们获得
!=
 时,他们会对没有获得 
==
感到有点皱眉,并且他们必须重新调整逻辑以使用
==
而不是
!=

所以你可以忍受它,但要准备好迎接一些皱眉和抱怨不便以及不提供用户友好界面的情况。
    

你必须让每个操作员超载。 != 和 == 没有链接。


9
投票

事实并非如此,幸好事情就是这样。例如,您可能需要一个结构,其中 a!=b 和 a==a 都为 true。它们不一定是相反的,它们可以是您想要的任何东西。


1
投票

例如,如果您不知道比较的结果,或者通常不知道,那么 a==b 和 a!=b 返回相同的结果是合理的。

示例:

http://en.wikipedia.org/wiki/Three-valued_logic

这个答案自 C++20 以来已经改变。


0
投票
operator ==

将“得到你!=”,从某种意义上说,您可以使用该运算符,并且它将根据

operator ==

来实现。 结果简直是颠倒了。

如果结果并非严格与
operator !=
相反,您仍然可以选择实施

operator ==

,或者您可以

= delete
如果您想明确禁止其使用。
    

© www.soinside.com 2019 - 2024. All rights reserved.