是否是一個壞主意超載& &,||或逗號運算符和爲什麼?重載邏輯運算符被認爲是不好的做法?
回答
我不會超載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. 將AND用作邏輯門是否被認爲是良好的做法?
- 3. 邏輯運算符什麼都不做的名字是什麼?
- 4. 做...邏輯運算符while循環
- 5. 邏輯&&運算符
- 6. 邏輯運算符
- 7. 邏輯運算符||
- 8. 邏輯運算符
- 9. 被C++邏輯OR(||)運算符困惑
- 10. 認爲是好的做法?
- 11. 邏輯比較==運算符過載
- 12. 爲什麼$在cakePHP中被認爲是不好的做法?
- 13. 重載運算符C++的邏輯錯誤
- 14. 使用html'confirm'方法是否被認爲是良好的做法?
- 15. Python邏輯運算符
- 16. 結合邏輯運算符
- 17. 邏輯運算符Objective-C
- 18. 邏輯運算符或者
- 19. C++邏輯運算符Q
- 20. C:邏輯運算符
- 21. 邏輯比較運算符
- 22. Java邏輯運算符
- 23. Javascript邏輯運算符:?
- 24. PHP邏輯運算符
- 25. 邏輯與運算符與
- 26. 邏輯運算符在PHP
- 27. Spring SpEL邏輯運算符
- 28. 邏輯AND運算符
- 29. Codeigniter邏輯運算符
- 30. PHP邏輯運算符
這感覺像是一個期末考試的問題;) – defbyte 2011-02-27 12:13:41