374_____________ ______Часть III. Современное программирование на C++
его кажущейся простоты ~ это плохой тон. К тому же чаще всего код не настолько элементарен. Другая проблема состоит в том, что появляются дополнительные хлопоты при сопровождении этой программы, так 'как любые изменения в одном конструкторе должны синхронно отражаться на другом. Обе эти проблемы не из приятных.
В действительности в данном примере вполне достаточно одного конструктора с заданными по умолчанию значениями аргументов:
DIR_LIST ( char* fname = "*.*", unsigned int attrib = 0) { done =• findfirst ( fname, this, attrib); }
В нашем вымышленном примере объем кода сократился вдвое. Не стало проблем синхронизации, тестировать теперь придется не две, а только одну функцию, и функциональность конструктора при этом осталась совершенно без изменений.
Что нельзя перегружать
Мы рассмотрели, как происходит перегрузка функций и разобрали несколько примеров перегружаемых функций. Вкратце, компилятор Borland C++' уточняет имена функций, расширяя их за счет типов аргументов так, чтобы создать уникальные имена. После этого по уточненным именам в таблице символов отыскиваются соответствующие адреса и разрешаются вызовы функций. Весь этот процесс происходит автоматически.
Мы пока не обсудили подробно еще несколько перегружаемых функций, а также те немногие, которые не могут быть перегружены. Исчерпывающие сведения по этой теме следует искать в документации по стандарту ANSI C++ или в руководстве Annotated Reference Manual. Сейчас мы рассмотрим несколько более сложных примеров, обращая внимание на то, чего следует избегать при перегрузке функций.
Компилятор Borland C++ на удивление разумен. Он способен распознать все виды неопределенностей. Предположим, что имеется две перегружаемых функции; одна принимает целый, а вторая символьный аргументы:
void Foo ( int n) ;
void Foo ( char* p) ;
При вызове
Foo ( 0);
всегда вызывается версия Foo, принимающая целый аргумент, потому что о - это все-таки целое число. Однако вы с полным правом можете захотеть вызвать
Foo ( char* p);