如果我手动重载==
一个结构的运算符,我是否可以!=
免费获得运算符(可能被定义为布尔反对),或者我是否必须手动重载(即使只是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
重载!=
时忽略并且不过载会发生什么==
?
如果您的类的用户使用!=
它们将得到编译错误.当他们被提供时,他们会对
没有被提供的东西皱眉头,他们将不得不重新调整他们的逻辑而不是使用. !=
==
==
!=
所以你可以忍受它,但准备好期待一些皱眉和抱怨不方便,而不是提供用户友好的界面.