Глава 14. Базовые концепции классов____________________________345

когда известно определенное предпочтительное значение аргумента, но при этом желательно сохранить возможность задания альтернативного значения:

class DIR

{

public:

DIR( char *fname = "*.*");

// "*.*" — это аргумент по умолчанию

// ...

// ... все остальное »;

Опытному взгляду этот класс скажет: "Если вы не передадите функции DIR аргумент типа char*, то будет подставлено значение "*.*"." Приемлемо и то, и другое. Таким образом, экземпляры класса DIR можно создавать следующими способами:

DIR default; //*,.* DIR root("C:\\"); // fname = "С:\\"

Правило использования аргументов по умолчанию таково: аргументу можно задать значение по умолчанию, если он находится правее всех в списке аргументов или если все аргументы правее него имеют значения по умолчанию.

Ниже приведены несколько фиктивных конструкторов, демонстрирующих примеры правильного и неправильного употребления аргументов по умолчанию:

F( int a = 0, int b); // ошибка: F(, 5) смотрится глупо G( int a, int b = 10); // правильно: G( 5); G( 3, 4);

H( int a, int b); // правильно: Н( 3, 4);

Правило для аргументов по умолчанию было введено для того, чтобы не возникало ситуаций "пробел запятая аргумент" (см. конструктор F), которые весьма чреваты ошибками, да и выглядят неважно.

(Необходимо также подчеркнуть следующее: конструктор, все аргументы которого снабжены значениями по умолчанию, может вызываться и с аргументами, и без аргументов, то есть при вызове выглядеть как обычный конструктор по умолчанию. Поэтому следует избегать неопределенности, возникающей при одновременном задании в классе конструктора по умолчанию, то есть без аргументов, и конструктора, у которого все аргументы имеют значения по умолчанию, — прим. перев.). '

Конструкторы В целом. Конструкторы предназначены для того, чтобы обеспечить разработчика класса средством удобной инициализации каждой из составных частей класса. Количеству и разнообразию аргументов конструктора нет предела, однако обычно типы аргументов соответствуют дан-