2014-10-08 2 views
-9

Мой профессор попросил меня найти, какие операторы на C++ не могут перегружать и в чем причина этого. Я обнаружил, что точка (.), разрешение области (: :), условные (? :), sizeof() операторы не могут быть перегружены. может ли кто-нибудь объяснить мне причину этого?о перегрузке оператора

+5

http://www.stroustrup.com/bs_faq2.html#overload-dot –

+0

Я просматриваю вчера сайты веб-сайтов. Объяснений на этих веб-сайтах слишком сложно понять. Если вы можете объяснить это проще, сделайте это –

+0

Он является создателем C++, почему бы вам не хотеть ответа прямо из уст лошади? – CoryKramer

ответ

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

, но мы можем перегрузить -> оператор, который используется для цели компилятора. Зачем? –

+0

@AbhijithPHaridas 'operator->' состоит из 'operator *' then 'operator.', когда вы перегружаете' operator-> ', вы только перегружаете часть' operator * ', на самом деле вы вынуждены возвращать указатель который компилятор будет разыменовывать, а затем использовать его собственную собственную и божественную мощную реализацию 'operator.' См. http://stackoverflow.com/q/4421706/1147772. – Drax

Смежные вопросы