Глава 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, но вместо предопределенных значений маски имени файла и байта атрибутов использует значения аргументов.

Дальше обе эти функции должны быть отлажены и протестированы. Конечно, эти примеры достаточно тривиальны, чтобы позволить себе просто проверить их глазами, но игнорировать отладку и тестирование кода вследствие