Глава 16. Перегрузка операций________________________________379
Как это работает
Возможность перегрузки операций была заложена в C++ изначально, как неотъемлемое свойство языка. Это означает, что существуют совершенно четкие правила, и вам только остается их изучить.
Вы уже сталкивались с перегружаемыми" операциями как пользователь: cout и cin — это экземпляры класса потоков ввода-вывода, имеющие перегруженные операции потока вывода » и потока ввода «. Цель перегрузки состоит не в том, чтобы изменить смысл операций, а наоборот, определить аналогичные операции для новых классов. Проще говоря, вы пишете оператор-функцию, описывающую алгоритм манипулирования объектами для конкретной операции.
Уникальные имена. Определяемые вами оператор-функции и операции, предназначенные для базовых типов данных, используются совершенно одинаково. Однако с точки зрения компилятора, перегруженная оператор-функция — это функция, определенная разработчиком класса (вами или кем-то еще, кто этот класс написал).
Так как компилятор рассматривает операции как функции, он должен преобразовать операцию в адрес оператор-функции. Следовательно, оператор-функции должны иметь уникальные имена, в противном случае компоновщик не сможет разрешить ссылки на них. А так как имя такой функции всегда имеет вид operator token_symbol, то есть состоит из ключевого слова operator и знака соответствующей операции (например, operators-), значит компилятор должен располагать соответствующим механизмом создания уникальных имен.
Уточнение имен операций. Оператор-функции перегружаются почти так же, как и обычные функции. Из имени функции и типов аргументов создается уникальное уточненное имя. И в случае оператор-функции, как и в случае обычной функции, возвращаемый тип в процессе уточнения имени участия не принимает. Уточнение имен и перегрузка описаны в главе 15 "Перегрузка функций" во всех подробностях.
Допустим, мы создали для класса х перегруженную операцию сложения. Теперь мы можем использовать операцию + для х точно так же, как используем ее для базовых типов данных:
Х х, у, z; // х, у, z — объекты класса Х
х = у + z; // синтаксически выглядит точно так же, ' // как если бы Х был классом целых чисел
Синтаксис не изменился. Будь х типа int, или типа char, или какого другого типа — синтаксис всегда одинаков. Это означает, что компилятор должен уметь различать конкретные случаи употребления операции +. Проблема