Глава 16. Перегрузка операций________________________________385
Раскроем вызов функции operator+, что будет выглядеть так:
INT с = а.operator+(Ь);
При разрешении вызова функции компилятор и компоновщик могут приводить аргументы в соответствие. У нас есть функция-член operator+, принимающая INT. Компилятор и компоновщик смогут разрешить выражение
INT с = а + 5;
У нас нет функции operator+(int) для объектов INT. Поэтому из числа 5 создается временный объект типа INT, значит фактически код будет эквивалентен следующему:
INT с = a.operatorf INT(5));
Здесь значение 5 используется для создания временного объекта типа INT. После этого вызовы функций уже разрешимы.
Замечание
IC++ может выполнять одно преобразование типов в попытке разрешить вызовы функций (это похоже на приведение типов).
Когда функции типа opreator+ являются членами класса, возникают проблемы с симметрией выражений. Тот же код из 5 и а после перестановки выглядит так:
INT с = 5 + а;
Раскрыв это выражение, получим явную нелепость
INT с = 5.operator+ (а); // Этот вариант, очевидно, не работает
Константа 5 не является объектом, следовательно у нее нет функций-членов. Этот фрагмент кода показывает, что превращение operator+ в функцию-член нарушает принцип симметрии для сложения, что было бы нежелательно. Следовательно, operator+ не может быть функцией-членом, если специально для нее не разрешить асимметрию, а такой случай явно не подходит для чисел.
Замечание
Как мы помним из школы, принцип симметрии в математике означает, что
а + Ь = Ь + а
Если ваш код будет нарушать этот принцип, то использовать его будет затруднительно.