368 Часть III. Современное программирование на C++

Механизм уточнения имен важен для облегчения бремени создания и запоминания излишних уникальных имен. Компилятор и компоновщик уточняют имена и разрешают вызовы автоматически. Если ни то, ни другое не решает проблемы, то вы, скорее всего, получите на этапе компиляции сообщение о неоднозначности.

Хотя в руководстве ARM предлагается несколько иная формула уточнения, однако результат остается прежним — бремя запоминания и изобретения уникальных имен перекладывается на компилятор.

Перегрузка функций

Перегрузка производится автоматически. Вам остается только решить, какие функции будут носить одинаковые имена. Перегрузку функций стоит использовать там, где дело касается конструкторов. — поскольку имена конструкторов все равно должны совпадать с именем класса. Оператор-функции могут отличаться типами возвращаемых значений и аргументов, но имя функции у всех операций одно и то же (т. е. operator).

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

Глобальные функции

Термин глобальные функции (global functions) относится к функциям, которые определены в глобальном пространстве имен. Другими словами, они не являются членами классов. Перегрузка глобальных функций, включая перегрузку оператор-функций, относится к функциям, имеющим одинаковые имена, но разные аргументы (см. главу 16).

Как было упомянуто выше, перегрузка функций используется в случаях, когда функции с точно совпадающими именами определены в одном пространстве имен. Что касается функций, не включенных ни в какой класс, имеются в виду функции, определенные в одном модуле. Это означает, что если функции описаны в заголовочном файле и этот файл включен в модуль (файл .срр), то функции с одинаковыми именами находятся в одном пространстве имен. В этом случае перегрузка возможна, если типы их аргументов различны. В общем случае это означает, что различны используемые типы данных, но также перегрузка может основываться и на разном количестве аргументов. (Последняя часть данной главы специально посвящена тому, что может, а что не может быть перегружено).

Рассмотрим несколько рекомендаций, позволяющих определить, когда следует пользоваться перегрузкой, а когда лучше предпочесть другие средства.