Глава 15. Перегрузка функций______________________________3/3
Здесь надо просто преодолеть барьер постижения синтаксиса языка C++. Гораздо более серьезный барьер — научиться понимать, когда какие идиомы C++ использовать. Есть вещи безусловно нужные, без которых ваша программа расползется по швам, например, конструктор копий или операция присваивания. Другие же средства существуют скорее для удобства и не столь нужны для жизнеспособности ваших систем.
Были проведены исследования, во сколько обходится компаниям поддержка программного обеспечения за год. Назывались цифры порядка $1.50 — $3.00 за строку программы в год. Хотя у разных компаний все по-разному, несомненно одно: поддержка программных систем — удовольствие дорогое. В известном смысле, чем короче программа, тем лучше.
Аргументы по умолчанию уместны тогда, когда вы пишете функции или конструкторы, выполняющие одни и те же действия, но с разными значениями аргументов. Если одна версия интерфейса функции не имеет параметров, так как использует некоторые предопределенные значения, а другая версия требует передачи ей аргументов, то для передачи значений используйте механизм аргументов по умолчанию.
Замечание
Каждый объект может ссылаться на самого себя при помощи указателя r,his. Класс DIR_LIST (см. главу 14) является производным от структуры ffblk, определенной в заголовке dir.h. Функция findfirst принимает указатель на структуру ffbl't. Вследствие родственных связей между DIR LIST и ffbik (OTR LIST является потомком ffblk) значение указателя this является допустимым значением аргумента функции findfirst.
Допустим, при написании программы вы создали один конструктор, который работает со значениями по умолчанию. Например
// конструктор, использующий умолчание "*.*" DIRJLIST () ' done - findfirst ("*.*", this, 0); }
Полное определение класса DIR_LIST находится в главе 14. Здесь мы сочли, что значения по умолчанию функции findfirst должны быть "*,*" для маски имени файла и о в качестве атрибута файла. Теперь определим второй конструктор, принимающий аргументы для имени файла и байт атрибутов:
DIR_LIST S char* fname, unsigned int attrib) { done = findfirst ( fname, this, attrib); }
В этом листинге конструктор выполняет точно те же операции, что и первый. Он вызывает функцию findfirst, но вместо предопределенных значений маски имени файла и байта атрибутов использует значения аргументов.
Дальше обе эти функции должны быть отлажены и протестированы. Конечно, эти примеры достаточно тривиальны, чтобы позволить себе просто проверить их глазами, но игнорировать отладку и тестирование кода вследствие