重载“==”得到你'!='?
如果我手动重载一个结构==
运算符,我是否免费获得!=
运算符(大概定义为布尔相反),还是我不得不手动重载它(即使只是return !(this == rhs)
?
编辑 – 问题不在于我是否可以重载这两个运算符,而是如果我已经重载了相等运算符,是否必须重载不等式。 无论如何,已经给出了很好的答案。
重载operator ==
不会给你operator !=
。 你必须手动执行,规范的方法是按照!(left == right)
的operator ==
来实现。
运营商的语义不是由标准决定的。 你可以很好地重载operator ==
意味着平等,但重载operator !=
对于不同的东西,如增加,甚至再次平等(这不是一个好的做法,实际上它应该是灰心的,如果有疑问,做整数…) [请参阅下面的(1)
另外, Boost.Operators
可以帮助您为运营商提供规范的实现。 对于operator !=
还有std::rel_ops
和一个规范实现。
(1)了解更多关于它的信息阅读C ++中运算符重载的三个基本规则。
没有什么是免费的。 你支付你在C ++中使用的(在运算符重载的情况下)。
你只有运营商,你没有更多的重载。
另外,如果你重载==
操作符,那么你应该重载!=
,因为你的类的用户会期望可用。
运算符重载 C ++ FAQ应该是一个很好的阅读。
回答更新的问题:
问题不在于我是否可以重载这两个运算符,而是如果我已经重载了相等运算符,是否必须重载不等式。
没有。
没有这样的要求,你必须重载!=
如果你需要超载==
。 但是,这是一个很好的做法,你应该重载运算符相互关联。
为什么这是一个很好的做法?
从你class级的用户的angular度来思考。 如果你的类的用户可以使用==
(相等标准)来比较你的类的对象,那么他们自然会期望他们应该能够使用!=
(非平等标准),这源于事实这两个运营商密切相关,并支持所有内置的tyes。
如果你忽视should
而不是超负荷,会发生什么事情!=
当你超载时==
?
如果你的类的用户使用!=
他们将得到一个编译错误。
当他们提供==
时,他们会皱起眉头,不会提供!=
,他们将不得不调整他们的逻辑来使用==
而不是!=
。
所以你可以忍受它,但准备期待一些皱眉和投诉的不便,不提供用户友好的界面。
您必须重载每个操作员。 !=和==不链接。
事实并非如此,幸好它是这样的。 例如,你可能想要一个结构,其中!= b和a == a都是真的。 他们不是必要的,他们可以是任何你想要的。
提高创造力。 🙂
例如,如果你不知道比较的结果,或者一般不知道,那么a == b和a!= b返回的结果是合理的。
例如: http : //en.wikipedia.org/wiki/Three-valued_logic