我的教授要求我查找C++中的哪些運算符無法重載,原因是什麼。我發現點(。),範圍解析(::),條件(?:),sizeof()運算符不能重載。任何人都可以告訴我爲什麼?關於運算符重載
關於運算符重載
回答
struct Troll
{
int money = 0;
int problems = 0;
float cant_touch_this = 0.0;
int& operator.(const std::string& member_name)
{
if (member_name == "money")
return problems;
else if (member_name == "problems")
return money;
else if (member_name == "cant_touch_this")
throw cant_touch_this;
else
throw 0;
}
};
int main()
{
Troll t;
t.money = 42;
t.problems = 3;
}
在寫上面的代碼中那肯定不能編譯,我問自己多個問題:
- 我應該
operator.
返回類型是什麼? - 需要使用哪個參數?
- 我如何處理我拋出的情況?
- 爲什麼我需要運行時間開銷來評估編譯時成員?
- 其他開發者可以通過切換我的成員來適應我嗎?
- 這份名單可以繼續下去...
這是儘可能多的原因,爲什麼你不能超載點(。)運算符,並有你會問自己類似的問題,試圖超載非可重載的操作員。
一個聰明的頭腦可能會找到這些問題的不錯答案,但是這個頭腦要麼還沒有誕生,還不是C++委員會的成員,不是標準功能提案的粉絲,或者根本就不在乎,因爲他沒有需要這個功能。
但我們可以重載 - >操作符用於smiler目的。爲什麼? – 2014-10-08 14:48:10
@AbhijithPHaridas'operator->'由'operator *'然後'operator.'組成,當你重載'operator->'時,你只會重載'operator *'的一部分,實際上你必須返回一個指針編譯器將取消引用,然後使用它自己的本地和'operator'的神聖強大的實現。請參閱http://stackoverflow.com/q/4421706/1147772。 – Drax 2014-10-08 14:50:50
- 1. 關於C++運算符重載
- 2. 關於運算符重載決策
- 3. 關於產品()運算符重載
- 4. 關於運算符重載在C++
- 5. 有關運算符重載
- 6. 運算符重載 - 重載*
- 7. 重載運算符
- 8. 運算符重載
- 9. 重載運算符*
- 10. *運算符重載
- 11. 重載運算符[]
- 12. 重載運算符 '+ ='
- 13. 重載+運算符
- 14. 重載運算符=
- 15. 運算符重載+ =
- 16. 運算符重載
- 17. 重載運算符%
- 18. 重載運算符+
- 19. 重載運算符*
- 20. 重載++運算符
- 21. 運算符重載
- 22. 運算符重載(=)
- 23. 重載=運算符
- 24. 重載+ =運算符
- 25. 運算符重載?
- 26. C++運算符重載利用關聯
- 27. 重載模板關係運算符
- 28. 有關在運算符重載定義
- 29. C++:運算符重載,運算符+
- 30. 運算符重載運算符()'
http://www.stroustrup.com/bs_faq2.html#overload-dot – 2014-10-08 14:05:42
昨天我瀏覽了stroustrup的網站。該網站的解釋太難理解了。如果你可以更簡單地解釋它,請做它 – 2014-10-08 14:09:09
他是C++的創造者,爲什麼你不想直接從馬的嘴裏得到答案? – CoryKramer 2014-10-08 14:10:23