我發現這裏的一些帖子討論有關運算符重載和運算符不能在C++中重載如.
::
.*
sizeof
等等。但我無法找到有關爲什麼應該避免.*
的具體細節或原因?幾個你可能會投它的重複,但我會很樂意,如果我得到我想要的那些鏈接:)爲什麼。*運算符不能在C++中重載?
2
A
回答
8
從Horse's mouth細節:
操作
.
(點)的,原則上使用與 - >相同的技術來過載。但是,這樣做可能會導致問題,您的操作是否是爲超載.
對象或.
提到例如對象:
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?
}
這個問題可以通過多種方式來解決。在標準化的時候,哪種方式最好不明顯。
AFAIU同樣的道理適用於.*
+0
除非rhs上的類型不是'Y ::'的成員指針。 – curiousguy
1
這是很容易理解,如果你通過操作函數調用的內在機制。
說一個類Complex
可以有兩個成員; r
爲實部,i
爲虛部。例如:
Complex C1(10,20),C2(10,2) // we assume there is an already a two argument constructor within class.
現在,如果你寫C1+C2
的一份聲明中,編譯器試圖找到+
操作的重載版本的複數。如果您超載+
話務員,則C1+C2
在內部翻譯爲c1.operator+(c2)
。
但是,你會翻譯一個過載的.
運算符爲?例如:
C1.disp()//display content of a complex object
現在試着想出一個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. C#運算符重載性能
- 27. 爲什麼在SceneKit中沒有運算符重載?
- 28. 在C++中訪問重載運算符
- 29. 在C++中重載賦值運算符
- 30. 在C++中重載運算符`:=`
這是出於同樣的原因'運營商.'不能超載。 –
@Nicol Bolas你的意思是說我們可以重載 - > *所以我們不應該超載。 – Invictus
@Ritesh:我不認爲你可以從Nicol所說的那個推論出來。他只是說,不允許'operator.'重載和'operator。*'重載的原因是一樣的。沒有鏈接到'運算符 - > *'(至少不是直接) –