362_____________________Часть III. Современное программирование на С++
С++ позволяет давать одинаковые имена функциям, деятельность которых похожа внешне, но различна физически. Возьмем для примера такое действие, как печать. Для каждого базового (не говоря уже о производных) типа данных требуется отдельная функция печати. В традиционном языке вам бы пришлось для каждой из них придумать свое имя, например, используя в качестве части имени функции тип данных:
Printint ( int var) ;
PrintChar ( char var) ;
PrintFloat ( float var) ;
Если этого мало, представьте, что нам требуется еще и переключаться между устройствами вывода — файлом, принтером или экраном. Можно решить эту проблему, используя операторы switch или if... else и передавая тип устройства как параметр. Можно даже создать по отдельной функции для всех возможных комбинаций типов данных ^устройств вывода (не удивляйтесь — есть программисты, поступающие именно так).
» Следуя этим курсом, мы очень скоро упремся в то обстоятельство, что количество имен для одного простого действия — печати — стало неоправданно велико. А что будет, если нам захочется печатать данные еще и производных типов? Перегрузка функций как раз и решает эту проблему: она позволяет сократить число используемых имен функций.
Время, которое вам придется потратить осваивая перегрузку функций, того стоит. Как минимум, перегрузка снимет неприятную проблему изобретения и запоминания большого числа имен функций. Начнем с примеров.
Примеры перегрузки функций
Поддержка перегрузки функций языком C++ позволяет сократить число уникальных имен, которые приходится придумывать для наших функций — это уже само по себе хорошо. Посмотрим, как это делается, на примере приглянувшихся нам функций печати.
Функции печати предназначены для того, чтобы выводить некую информацию на то или иное устройство. Именно для этого была создана функция printf. Решение, к которому пришли разработчики этой функции в попытке сократить число имен, заключалось в использовании переменного количества числа аргументов (см. главу 6, раздел "Функции printf'и scanf"). Списки аргументов переменной длины, обозначаемые многоточием (...), позволяют задавать произвольный по величине и типам данных набор аргументов. Для этого и требуется строка формата в функции printf — описание 'формата в первом аргументе помогает функции printf выбирать аргументы из стека. Механизм, реализованный в функциях printf и scant, определяет, что за данные помещены в стек и выбирает их из стека в нужной последовательности в соответствии с их типами. И все это для того, чтобы избежать захламления библиотеки stdio избыточными именами. Поверьте, немало тру-