Перегрузка функций — это механизм С++, благодаря которому функции с разным количеством или типами параметров могут иметь одинаковое имя (идентификатор).
Как правило, разным функциям дают различные имена, но когда функции выполняют концептуально аналогичные задачи для объектов различных типов, может оказаться удобным присвоить им одно и то же имя. Использование одного имени для операции, выполняемой с различными типами, называется перегрузкой.
Например, допустимо определить пользовательские функции:
С точки зрения компилятора, единственное, что данные функции имеют общего между собой — это имена. Язык не накладывает в связи с этим никаких ограничений на программиста, и эти функции могут делать совершенно разные вещи.
Создадим несколько собственных реализаций функции модуля числа:
Когда вызывается функция abs(), компилятор должен определить какую из функций с именем abs() использовать. Идея состоит в том, чтобы использовать функцию с наиболее подходящими аргументами и выдать сообщение об ошибке, если таковой не найдено.
Критерии наилучшего соответствия параметров выстроены в следующем порядке:
Если соответствие может быть получено двумя или более способами на одном и том же уровне критериев, вызов считается неоднозначным и отвергается.
Функции, объявленные в различных областях видимости, не являются перегруженными. Если нужно, чтобы область действия перегрузки пересекала области видимости классов или пространство имен, можно воспользоваться директивой using.
Возвращаемые типы не участвуют в разрешении перегрузки.
Первые два типа перегрузки допустимы, а третий тип, хотя и встречается в других языках программирования, в языке С++ недопустим.