回答
見this quote from Bjarne Stroustrup:
操作。 (點)原則上可以使用與 - >相同的技術來過載。但是,這樣做會導致問題 有關操作是否適用於對象重載。或一個 對象所指的。例如:
class Y { public: void f(); // ... }; class X { // assume that you can overload . Y* p; Y& operator.() { return *p; } void f(); // ... }; void g(X& x) { x.f(); // X::f or Y::f or error? }
此問題可以通過多種方式解決。在標準化的時候,哪種方式最好不明顯。有關詳細信息,請參見The Design and Evolution of C++。
斯特勞斯has an answer for this question:
操作。 (點)原則上可以使用與用於 - >的 相同的技術來重載 。但是,如果這樣做,則 會導致有關 操作是否適用於對象 重載的問題。或者是由 所引用的對象。例如:
class Y { public: void f(); // ... }; class X { // assume that you can overload . Y* p; Y& operator.() { return *p; } void f(); // ... }; void g(X& x) { x.f(); // X::f or Y::f or error? }
這個問題可以通過幾種方式解決 。在標準化時, 不清楚哪一種方式最好是 。有關更多詳細信息,請參閱D&E。
Stroustrup說C++應該是一種可擴展但不可變的語言。
點(屬性訪問)操作符被認爲太靠近語言的核心以允許超載。
請參閱The Design and Evolution of C++,第242頁,第部分11.5.2智能參考文獻。
當我決定讓運營商
->
超載,我自然考慮是否操作.
也同樣可以過載。當時,我認爲以下論點是決定性的:如果
obj
是類對象,那麼obj.m
對該對象類的每個成員m
都有含義。我們儘量不要通過重新定義內置操作來使語言變爲可變(儘管該規則違反了=
的急迫需求,並且對於一元的&
)。如果我們允許一類
X
的.
超載,我們將無法通過正常手段獲得的X
成員;我們將不得不使用指針並且->
,但是->
和&
也可能已被重新定義。我想要一種可擴展的語言,而不是一個可變的語言。這些論點很重要,但不是確鑿的。特別是在1990年,Jim Adcock提出允許運營商
.
恰好超載運營商->
的方式。
此引用中的「I」是Bjarne Stroustrup。你不可能比那更具權威性。
如果你想真正理解C++(例如「爲什麼是這樣」),你應該閱讀本書。
這很容易理解,如果你通過運算符函數調用的內部機制, 說一個類複合體可以有兩個成員r爲實部和i爲虛部。 說複雜的C1(10,20),C2(10,2) //我們假設在類中已經有了一個兩個參數的構造函數。 現在,如果您編寫C1 + C2作爲語句,那麼編譯器會嘗試在複數上查找+運算符的重載版本。現在我們假設我是過載+運算符,所以 C1 + C2內部翻譯爲c1.operator +(c2) 現在假設您的時間可以重載'。'運營商。 所以現在想下面再打電話C1.disp() //顯示一個複雜對象的內容現在嘗試表示爲內部表示 C1.operator。(------),創建完全混亂的東西。這就是我們不能超載的原因。''運算符
- 1. 爲什麼。*運算符不能在C++中重載?
- 2. C++運算符重載稱爲功能
- 3. 爲什麼==運算符在MSVC中含糊不清的運算符重載
- 4. 爲什麼我不能重載::運算符?
- 5. 爲什麼我不能重載*運算符?
- 6. 爲什麼比較運算符不能自動重載IComparable?
- 7. 爲什麼我的運算符重載不能編譯?
- 8. 爲什麼三元運算符不能被重載?
- 9. 爲什麼C#不允許運算符重載?
- 10. 爲什麼重載運算符&&錯誤?
- 11. 運算符+ =重載,爲什麼是const?
- 12. 爲什麼運算符重載失敗?
- 13. C++運算符在已重載的運算符中重載
- 14. 爲什麼在VB.NET中賦值運算符不可重載?
- 15. C++不重載運算符
- 16. 爲什麼我不得不在C++中重載賦值運算符?
- 17. 爲什麼C++將賦值(=)視爲重載運算符?
- 18. +運算符重載在C++
- 19. 重載[] []在C++運算符
- 20. 爲什麼我不能在另一個文件中重載<<運算符?
- 21. 爲什麼不QString超載+運算符?
- 22. C++:運算符重載,運算符+
- 23. Visual C++ 2012:爲什麼priority_queue需要重載賦值運算符?
- 24. 爲什麼C#運算符重載必須是靜態的?
- 25. 重載運算符C++:爲什麼分母乘以10
- 26. 爲什麼你不能在類中的數組值中使用運算符?
- 27. C#運算符重載性能
- 28. 爲什麼在SceneKit中沒有運算符重載?
- 29. 「你不能轉發重載運算符&的聲明類」?
- 30. 爲什麼你不能在c#中做多重繼承?
您能舉一個例子說明何時需要重寫'。'。運營商? – 2009-02-06 12:01:15
通常,用例是「智能參考」。一種代理。 – ddaa 2009-02-06 12:12:57
@Gamecat:通讀[this](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1671.pdf)提議增加重載`operator.`的能力和`operator。*`,它有幾個例子。 – Mankarse 2012-02-12 02:46:43