我目前查看了一个旧的 C++ 代码库,发现很多代码都是这样的:
bool SomeClass::operator==( const SomeClass& other ) const
{
return member1 == other.member1 && member2 == other.member2;
}
bool SomeClass::operator!=( const SomeClass& other ) const
{
return member1 != other.member1 || member2 != other.member2;
}
显然,比较逻辑是重复的,并且上面的代码可能需要在两个地方而不是一个地方进行更改。
AFAIK 的典型实施方式operator!=
是这样的:
bool SomeClass::operator!=( const SomeClass& other ) const
{
return !( *this == other );
}
在后一种情况下,无论发生什么逻辑变化operator==
它将自动反映在operator!=
因为它只是调用operator==
并执行否定。
有没有合理的案例operator!=
除了重用之外,应该以任何其他方式实现operator==
在C++代码中?
在大多数情况下,语义a!=b
应该等于!(a==b)
.
对于所有其他运算符也是如此:a<b
应该等于!(a=>b)
and to !(a==b || a>b)
and to a<=b && !(a==b)
等等等等。
为了这个目的boost.运算符 http://www.boost.org/doc/libs/1_45_0/libs/utility/operators.htm提供了一些很棒的工具来根据其他工具自动生成运算符。
但是,当您为运算符提供一些特定的语义时(即:您不使用==
检查两个项目是否相同,但要做一些像 STL 那样的花哨的事情>>
and <<
)你可能想给他们不同的实现。
一般来说,不建议这样做,尽管 STL 和许多 boost 库也这样做。
EDIT- 一点补充:
到目前为止我所说的仅涉及运算符的语义。如果您决定您的语义a!=b
应该!(a==b)
你有两种方法来实现它:
第一种方法通常更容易实现并且更安全。可以证明第二个选项合理的最常见的事情是优化,尽管它可能不值得:现代编译器在大多数情况下不会增加任何开销(如果您查看 boost.operators 源代码,您会看到许多关于它们如何依靠NRVO http://en.wikipedia.org/wiki/Return_value_optimization不增加任何开销,或者如果编译器不提供 NRVO,它们的代码将如何更改)。
无论如何,无论您选择什么选项,它都不应该对您的应用程序逻辑产生任何影响,因为重要的是语义(即:您的运算符如何行为,它们为任何可能的输入返回什么)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)