Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга C++.doc
Скачиваний:
24
Добавлен:
10.11.2019
Размер:
2.48 Mб
Скачать

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

Продолжаем исследовать волшебный мир С++! Как показывает опыт, большинство людей, которые изучают язык программирования, или совсем не обращают, или не уделяют особого внимания вопросу связанному с именами функций. Подумайте, как назвать переменную или функцию? Если у Вас появился ответ: "Главное чтобы функция работала, а как она будет называться неважно..." - то он имеет право на существование, но в большинстве ситуаций - неправильный. Объясним почему. Вы уже освоили азы С++, разработали большое количество программ. При создании программ у Вас вырабатывается собственный стиль написания (почти как почерк). Если проект разрабатывается группой программистов (а это все "серьезные" программы, такие как Corel, Photoshop и т.д.), то немаловажно, чтобы Ваш стиль написания был понятен другим программистам.

Обычно, выбор имени функции основан на стремлении отразить в названии ее основное назначение. "Читабельные" программы, как правило, содержат разнообразные и грамотно подобранные идентификаторы. Иногда, различные функции используются для одних и тех же целей. Согласитесь, что логично дать этим функциям одинаковые имена, которые бы отображали суть выполняемых действий этими функциями. Как программист, Вы можете сделать это используя механизм перегрузки функций.

Перегрузка (от англ. overloading) использует одно и то же имя для нескольких вариантов функции.

Другими словами, несколько функций могут иметь одинаковые имена. Но тогда появляется вопрос: «А как компилятор сможет различить две одинаковые функции?» Т.е. если имена функций одинаковы, то как компилятор узнает, какую функцию необходимо вызвать в данный момент?.

Выбор конкретного варианта зависит от типов аргументов, используемых функцией. Другими словами, компилятор различает функции с одинаковыми именами по параметрам, которые передаются в эту функцию. Программисты говорят, что компилятор отличает одну функцию от другой по ее сигнатуре.

Под сигнатурой понимается список типов, который используется в объявлении функции. Сигнатура функции задается числом, порядком следования и типами параметров. Имена функций могут быть перегружены в пределах одной и той же области видимости.

Перегруженные функции являются важным дополнением С++. Конкретная функция выбирается в зависимости от соответствия списка аргументов при вызове функции списку параметров в объявлении функции. Когда вызывается перегруженная функция, компилятор должен иметь алгоритм для выбора надлежащей функции.

Алгоритм, который выполняет этот выбор, зависит от того, преобразования какого типа присутствуют. Наилучшее соответствие должно быть уникальным. Оно должно быть лучшим по крайней мере для одного аргумента и так же хорошо, как остальные соответствия, для всех аргументов.

Отметим, что в ранних версиях С++ в начале области видимости, в которых выполнялась перегрузка, требовалось ключевое слово overload. Но, спешим Вас обрадовать, в Visual C++ это слово не применяется и, более того, исключено из списка ключевых слов.

Рассмотрим пример перегруженных функций.