2011-02-27 83 views

回答

12

我不会超载operator&&operator||。即使你定义了一个产生布尔代数的类(例如有限集),它也可能是一个更好的选择,可以重载operator&operator|

的原因是,C++程序员需要特殊语义operator&&operator||:他们是短路,即不如果没有必要评估他们的右手的说法。你不能通过重载来获得这种行为,因为你会定义一个函数。

超载operator,已经在例如图书馆的Boost.Assign。这也是我知道的重载的唯一例子,我从来没有考虑过自己重载它。在没有其他运营商适合的情况下,您最好有一个非常具体的用例。

+0

好点。所以,在这种情况下('operator bool()')提供一个转换为bool的运算符似乎更好? – davka 2011-02-27 12:36:03

+0

@davka:是的,如果您的类具有布尔逻辑语义,则可以定义'operator bool',从而免费为您提供短路。定义'operator&'和'operator |'如果它具有布尔代数语义,如有限集合(其中交集是'&',union是''')。 – 2011-02-27 12:38:49

+0

@Downvoter:请解释。 – 2011-02-27 13:13:51

4

对于C++中的逻辑运算符的重载,必须对运算对象进行求值,这不是通常情况下内建类型短路的方式。

看看下面的链接。

+2

这并没有说有关运营商的话。 – davka 2011-02-27 12:11:05

+0

糟糕。我的错。抱歉。我误解了这个问题。 – 2011-02-27 12:13:24

+0

@All:编辑答案 – 2011-02-27 12:19:59

0

的情况下,除了它的坏主意,当你的类代表一些逻辑实体,因为超载运营商将迷失方向,并可以在代码中造成新的漏洞。

+0

即使在定义“逻辑实体”(布尔代数)时,其他运算符也更适合。 – 2011-02-27 12:33:53

2

我想说这取决于你的重载在做什么。例如,& &和||预计会作为逻辑条件工作,所以如果你的超载语义在某种程度上以不同的方式工作,他们可能会混淆其他人(或者甚至你自己,如果你一段时间不使用它们并忘记它们的作用)。考虑一下如果你不知道它们是如何被重载的,你会期望操作员做什么,以及如果使用普通方法代替它会更清楚。

2

正如其他人所说,缺少懒惰评估是避免逻辑运算符超载的主要原因。

但是,有一个很好的理由让它们超载:Expression templates。 Boost.Lambda库可以做到这一点,它非常有用!

3

这通常是一个糟糕的主意:这三个操作符有一个排序效应,当你超载它们时会丢失。消除这种排序效应会导致那些不期待丢失的人(即奇怪的错误)。

有些模板表达式可以保持排序效果,在这些情况下,我认为在重载它们时没有问题。

我知道operator,的重载有另一个问题:它们的工作方式使得表观链不是真正的链。通常情况下,它们在没有区别的情况下使用,但在蓝色月亮中使用时,这是另一个奇怪错误的来源。

3

您不应该以惊人的方式重载任何操作符。:-)

如果你能以一种合理的方式做到这一点(不仅仅是你),这样做很好。

和其他人一样,逻辑运算符的特殊之处在于它们具有懒惰评估的效果。所以你的重载应该可以保持这种懒惰的效果,就像使用表达式模板一样,或者只在人们不希望这种效果的地方使用。