Глава 15. Перегрузка функций __ __ ___ 363
дов было потрачено на эти функции, а в результате они оказались удручающе медленными. Единственным оправданием такого решения может служить желание избежать еще больших проблем.
Поддержка перегрузки функций языком C++ позволяет варьировать типы аргументов, не утруждая процессор вашего компьютера списками аргументов переменной длины. Применим перегрузку к функциям печати из последнего примера. Тогда объявления функций могли бы выглядеть так:
int Print ( int); // Имена функций совпадают, аргументы отличаются int Print ( char);
int Print ( float);
int Print ( double);
Заметьте, что имена функций одинаковы: отличие функций — в типах аргументов. Именно на типах аргументов и основывается перегрузка функций. Перегрузка не требует от вас никакого активного вмешательства: вам нужно всего лишь объявить несколько функций с одинаковыми именами и значимо отличающимися типами аргументов. Если значимого различия нет, то компилятор предупредит вас о возникшей неопределенности.
Приведенные четыре объявления функций позволяют вызвать функцию print с аргументом одного из заданных типов. Какая из этих четырех функций будет вызвана на самом деле, определяется на этапе компиляции, а не во время выполнения с помощью манипуляций со стеком, как это сделано в функции printf.
Преимущества перегрузки
Лежащее на поверхности преимущество перегрузки функций — это сокращение числа имен, которые программист должен придумывать и держать в голове во время разработки программы. Кроме этого если сравнить объявление нашей (воображаемой) функции print и функции printf (из библиотеки stdio), то нашей явно проще пользоваться, поскольку для печати данных не требуется строка формата. Без использования механизма перегрузки функций программисту пришлось бы в каждом случае вызывать отдельную функцию со своим уникальным именем.
При работе же с классами перегрузка функций просто незаменима. В предыдущей главе мы видели, что конструкторы встречаются в различных формах. Среди них — конструкторы по умолчанию, конструкторы с аргументами и прочие. Предположим, что вам нужен статический или динамический массив объектов:
CLASS_NAME arrayOf [size]; // статический массив
// из size объектов. CLASS_NAME *dynamicArray = new CLASS NAME[size]; // динамический массив
// из size объектов.