重载'=='会让你'!='?

pre*_*lic 62 c++

如果我手动重载==一个结构的运算符,我是否可以!=免费获得运算符(可能被定义为布尔反对),或者我是否必须手动重载(即使只是return !(this == rhs)

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

K-b*_*llo 76

重载operator ==不会给你operator !=.你必须做手工和规范的办法就是实现它在以下方面operator ==!(left == right).

运营商的语义不是由标准决定的.你可以很好地超载operator ==意味着平等但是过度加载operator !=到不同的东西,比如加法甚至是平等(不是这是一个好的做法,实际上它应该是气馁的.当有疑问的时候,就像整理一样......).[参考下面的(1)]

另外,Boost.Operators可以帮助您为运营商提供规范的实施.还有std::rel_ops一个规范的实现operator !=.

(1)了解更多关于它的内容阅读C++中运算符重载的三个基本规则.


Alo*_*ave 17

没有什么是免费的.您支付在C++中使用的内容(在运算符重载的情况下).
您只能获得不再过载的操作员.

此外,如果您重载==运算符,那么您应该重载,这是一个很好的做法,!=因为您的类的用户将期望可用.

运算符重载 C++ FAQ应该是一个很好的阅读.


回答更新的问题:

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

没有.
没有这样的要求你必须超载!=如果你需要超载==.但是,您应该重载相互关联的运算符.

为什么这是一个好习惯?
从班级用户的角度来思考.如果你的类的用户可以使用==(相等标准)来比较你的类的对象,那么他们自然会期望他们应该能够使用!=(非等式标准),这源于这两个运算符的事实与所有内置染料密切相关并得到支持.

如果在should重载!=时忽略并且不过载会发生什么==
如果您的类的用户使用!=它们将得到编译错误.当他们被提供时,他们会对
没有被提供的东西皱眉头,他们将不得不重新调整他们的逻辑而不是使用. !=====!=

所以你可以忍受它,但准备好期待一些皱眉和抱怨不方便,而不是提供用户友好的界面.

  • C++的座右铭是"你不为你不使用的东西买单".通常,您会自动获得功能,例如,调用成员析构函数. (7认同)

scr*_*ola 9

你必须重载每个操作员.!=和==没有关联.