是否是一个坏主意超载& &,||或逗号运算符和为什么?重载逻辑运算符被认为是不好的做法?
回答
我不会超载operator&&
或operator||
。即使你定义了一个产生布尔代数的类(例如有限集),它也可能是一个更好的选择,可以重载operator&
和operator|
。
的原因是,C++程序员需要特殊语义operator&&
和operator||
:他们是短路,即不如果没有必要评估他们的右手的说法。你不能通过重载来获得这种行为,因为你会定义一个函数。
超载operator,
已经在例如图书馆的Boost.Assign。这也是我知道的重载的唯一例子,我从来没有考虑过自己重载它。在没有其他运营商适合的情况下,您最好有一个非常具体的用例。
好点。所以,在这种情况下('operator bool()')提供一个转换为bool的运算符似乎更好? – davka 2011-02-27 12:36:03
@davka:是的,如果您的类具有布尔逻辑语义,则可以定义'operator bool',从而免费为您提供短路。定义'operator&'和'operator |'如果它具有布尔代数语义,如有限集合(其中交集是'&',union是''')。 – 2011-02-27 12:38:49
@Downvoter:请解释。 – 2011-02-27 13:13:51
这并没有说有关运营商的话。 – davka 2011-02-27 12:11:05
糟糕。我的错。抱歉。我误解了这个问题。 – 2011-02-27 12:13:24
@All:编辑答案 – 2011-02-27 12:19:59
的情况下,除了它的坏主意,当你的类代表一些逻辑实体,因为超载运营商将迷失方向,并可以在代码中造成新的漏洞。
即使在定义“逻辑实体”(布尔代数)时,其他运算符也更适合。 – 2011-02-27 12:33:53
我想说这取决于你的重载在做什么。例如,& &和||预计会作为逻辑条件工作,所以如果你的超载语义在某种程度上以不同的方式工作,他们可能会混淆其他人(或者甚至你自己,如果你一段时间不使用它们并忘记它们的作用)。考虑一下如果你不知道它们是如何被重载的,你会期望操作员做什么,以及如果使用普通方法代替它会更清楚。
正如其他人所说,缺少懒惰评估是避免逻辑运算符超载的主要原因。
但是,有一个很好的理由让它们超载:Expression templates。 Boost.Lambda库可以做到这一点,它非常有用!
这通常是一个糟糕的主意:这三个操作符有一个排序效应,当你超载它们时会丢失。消除这种排序效应会导致那些不期待丢失的人(即奇怪的错误)。
有些模板表达式可以保持排序效果,在这些情况下,我认为在重载它们时没有问题。
我知道operator,
的重载有另一个问题:它们的工作方式使得表观链不是真正的链。通常情况下,它们在没有区别的情况下使用,但在蓝色月亮中使用时,这是另一个奇怪错误的来源。
您不应该以惊人的方式重载任何操作符。:-)
如果你能以一种合理的方式做到这一点(不仅仅是你),这样做很好。
和其他人一样,逻辑运算符的特殊之处在于它们具有懒惰评估的效果。所以你的重载应该可以保持这种懒惰的效果,就像使用表达式模板一样,或者只在人们不希望这种效果的地方使用。
- 1. C++运算符重载逻辑opertors
- 2. 做...逻辑运算符while循环
- 3. 逻辑运算符
- 4. 逻辑&&运算符
- 5. 逻辑运算符||
- 6. 逻辑运算符
- 7. 被C++逻辑OR(||)运算符困惑
- 8. 逻辑比较==运算符过载
- 9. 认为是好的做法?
- 10. 重载运算符C++的逻辑错误
- 11. 逻辑运算符Objective-C
- 12. Java逻辑运算符
- 13. 逻辑比较运算符
- 14. C++逻辑运算符Q
- 15. 逻辑与运算符与
- 16. 逻辑AND运算符
- 17. Spring SpEL逻辑运算符
- 18. 逻辑运算符:是和优于或?
- 19. 什么是NOR逻辑运算符?
- 20. ViewModel对象持有Dispatcher被认为是不好的做法吗?
- 21. 混凝土类注入被认为是不好的做法
- 22. 使用html'confirm'方法是否被认为是良好的做法?
- 23. 编辑原始JQuery文件被认为是不好的想法?
- 24. 为什么逗号,地址 - ,逻辑AND和逻辑OR运算符不应该在C++中重载?
- 25. 逻辑运算
- 26. 如何有多个“和”逻辑运算符和“或”逻辑运算符
- 27. 2列的逻辑运算(逻辑或)
- 28. 重载乘法运算符
- 29. 是否将数组转换为foreach被认为是不好的做法?
- 30. 运算符+ =重载,为什么是const?
这感觉像是一个期末考试的问题;) – defbyte 2011-02-27 12:13:41