Глава 16. Перегрузка операций_______________________________393

Обсуждаемые в данном разделе вопросы должны помочь понять, как использовать оператор-функции. Мы рассмотрим, как представлять операции в развернутом виде, чтобы сделать их понятнее.

Развернутая форма операций в контексте

Развернутая форма перегруженной оператор-функции помогает понять, что же реально означает код. При разворачивании фрагмента программы а = b + с;

где а, b и с — объекты некоторого типа, для которого определена функция operator+, создается визуальный контекст, помогающий понять, что же происходит.

Есть несколько приемов, которые могут помочь в идентификации элементов содержащего операцию фрагмента программы. Класс однозначно определяется по типам операндов, задавая направление дальнейших поисков. Посмотрите определение класса; начните с заголовочного файла с подходящим именем, если вам повезет, то круг поиска сильно сузится. Ищите, во-первых, оператор-функцию, так как только такие функции и могут здесь быть. Во-вторых, искомая операция должна соответствовать используемой в дешифруемом фрагменте. Наконец если операция объявлена как friend, то она должна быть глобальной функцией, если же нет, тогда, скорее всего, она является функцией-членом класса.

Если вам не удалось найти объявление, то, стало быть, вы имеете дело с глобальной функцией, принимающей данные посредством той или иной операции преобразования. Посмотрите не в самом классе, а вокруг него, в заголовке или в модуле: поищите комбинацию из ключевого слово operator, символа операции и аргументов, соответствующих использованным в исследуемом фрагменте.

Число аргументов

Существует ряд факторов, определяющих количество и расположение операндов оператор-функции. Первое — это количество аргументов операции. Одноместные операции имеют один аргумент, двухместные (бинарные) — два.

Местоположение операндов — в скобках, наподобие аргументов функций, или без — зависит от объявления оператор-функции. Если оператор-функция глобальная и/или дружественная, то число передаваемых аргументов соответствует порядку операции. С другой стороны, если перегруженная оператор-функция является членом класса, то одним операндом будет вызывающий объект (объект this), а второй, если требуется, передается в скобках как аргумент.

Вот несколько примеров, иллюстрирующих расположение аргументов-операндов: