Глава 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), которые весьма чреваты ошибками, да и выглядят неважно.
(Необходимо также подчеркнуть следующее: конструктор, все аргументы которого снабжены значениями по умолчанию, может вызываться и с аргументами, и без аргументов, то есть при вызове выглядеть как обычный конструктор по умолчанию. Поэтому следует избегать неопределенности, возникающей при одновременном задании в классе конструктора по умолчанию, то есть без аргументов, и конструктора, у которого все аргументы имеют значения по умолчанию, — прим. перев.). '
Конструкторы В целом. Конструкторы предназначены для того, чтобы обеспечить разработчика класса средством удобной инициализации каждой из составных частей класса. Количеству и разнообразию аргументов конструктора нет предела, однако обычно типы аргументов соответствуют дан-