364_____________________Часть III. Современное программирование на C++
Обратите внимание, что места для аргументов конструктора здесь нет: в этих примерах вызывается конструктор по умолчанию (в стандарте C++ это конструктор, не имеющий аргументов; в Borland C++ такой конструктор может принимать аргументы, но только в том случае, если все они имеют значения по умолчанию). Однако у вас может возникнуть необходимость передать объектам при инициализации некоторые аргументы, как в нашем классе DIR_LIST из главы 14. Тогда вам потребуется конструктор, принимающий аргументы, определяемые пользователем вашего класса.
Перегрузка функций перекладывает бремя вызова конкретного конструктора (конструктор — это тоже функция, хоть и специальная) на компилятор. Компилятор, исходя из комбинации имен и типов аргументов, легко определит, который вариант конструктора следует вызвать. Запомните, что конструктор обязан носить то же самое имя, что и класс, именно потому, что при создании объектов имя класса становится частью уточненного имени конструктора. Без использования перегрузки пришлось бы выбирать между конструктором по умолчанию, что подразумевает возможность создания динамических массивов объектов, и конструктором с аргументами, но без такой возможности. Все базовые типы данных поддерживают как отдельные объекты, так и массивы. Не поддерживать подобное свойство для классов было бы неуклюже и несимметрично.
Существуют и другие средства языка, немыслимые без перегрузки. Как иначе объекты cin и cout могли бы использовать один и тот же синтаксис для всех встроенных типов? Глава 16 объясняет, что и это возможно.
Когда происходит перегрузка?
Перегрузка функций происходит автоматически. Если определены функции с идентичными, вплоть до регистра символов, именами, но с различными типами аргументов, то компилятор сам позаботится о перегрузке.
Компилятор предпринимает одни и те же действия независимо от того, одинаковые имена вы даете своим функциям или нет, для компилятора они все равноправны. Поэтому, чем меньше в языке ключевых слов и чем более последовательны правила компиляции, тем легче язык поддается реализации. Если бы для перегрузки требовалось ключевое слово вроде overloaded, то компилятору пришлось бы просто отслеживать еще одно, дополнительное ключевое слово.
Чтобы не разрабатывать специальные правила для перегружаемых функций, обработка всех функций была унифицирована. А чем меньше правил, тем меньше исключений, которые нужно воплотить в коде (компиляторы ведь пишутся теми же программистами). Давайте посмотрим, как реализована перегрузка: понимание этого де-г^ет намного проще изучение и использование этого средства.