2014-10-08 72 views
-9

我的教授要求我查找C++中的哪些運算符無法重載,原因是什麼。我發現點(。),範圍解析(::),條件(?:),sizeof()運算符不能重載。任何人都可以告訴我爲什麼?關於運算符重載

+5

http://www.stroustrup.com/bs_faq2.html#overload-dot – 2014-10-08 14:05:42

+0

昨天我瀏覽了stroustrup的網站。該網站的解釋太難理解了。如果你可以更簡單地解釋它,請做它 – 2014-10-08 14:09:09

+0

他是C++的創造者,爲什麼你不想直接從馬的嘴裏得到答案? – CoryKramer 2014-10-08 14:10:23

回答

0
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++委員會的成員,不是標準功能提案的粉絲,或者根本就不在乎,因爲他沒有需要這個功能。

+0

但我們可以重載 - >操作符用於smiler目的。爲什麼? – 2014-10-08 14:48:10

+0

@AbhijithPHaridas'operator->'由'operator *'然後'operator.'組成,當你重載'operator->'時,你只會重載'operator *'的一部分,實際上你必須返回一個指針編譯器將取消引用,然後使用它自己的本地和'operator'的神聖強大的實現。請參閱http://stackoverflow.com/q/4421706/1147772。 – Drax 2014-10-08 14:50:50