Глава 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+ не может быть функцией-членом, если специально для нее не разрешить асимметрию, а такой случай явно не подходит для чисел.

Замечание

Как мы помним из школы, принцип симметрии в математике означает, что

а + Ь = Ь + а

Если ваш код будет нарушать этот принцип, то использовать его будет затруднительно.