Включение в C++ возможности передачи аргументов по умолчанию позволяет программистам упрощать код программ. Чтобы предусмотреть максимально возможное количество ситуаций и обеспечить их корректную обработку, функции часто объявляются с большим числом параметров, чем необходимо в наиболее распространенных случаях. Поэтому благодаря применению аргументов по умолчанию программисту нужно указывать не все аргументы (используемые в общем случае), а только те, которые имеют смысл для определенной ситуации.

Аргумент, передаваемый функции по умолчанию, представляет собой значение, которое будет автоматически передано параметру функции в случае, если аргумент, соответствующий этому параметру, явным образом не задан.

Насколько полезна возможность передачи аргументов по умолчанию, показано на примере функции clrscr(), представленной в следующей программе. Функция clrscr() очищает экран путем вывода последовательности символов новой строки (это не самый эффективный способ, но он очень подходит для данного примера). Поскольку в наиболее часто используемом режиме представления видеоизображений на экран дисплея выводится 25 строк текста, то в качестве аргумента по умолчанию используется значение 25. Но так как в других видеорежимах на экране может отображаться больше или меньше 25 строк, аргумент, действующий по умолчанию, можно переопределить, явно указав нужное значение.

#include

using namespace std;

void clrscr(int size=25);

int main()

{

 int i;

 for(i=0; i<30; i++ ) cout << i << '\n';

 clrscr(); // Очищаем 25 строк.

 for(i=0; i<30; i++ ) cout << i << '\n';

 clrscr(10); // Очищаем 10 строк.

 return 0;

}

void clrscr(int size)

{

 for(; size; size--) cout << '\n';

}

Как видно из кода этой программы, если значение, действующее по умолчанию, соответствует ситуации, при вызове функции clrscr() аргумент указывать не нужно. Но в других случаях аргумент, действующий по умолчанию, можно переопределить и передать параметру size нужное значение.

При создании функций, имеющих значения аргументов, передаваемых по умолчанию, необходимо помнить две вещи. Эти значения по умолчанию должны быть заданы только однажды, причем при первом объявлении функции в файле. В предыдущем примере аргумент по умолчанию был задан в прототипе функции clrscr(). При попытке определить новые (или даже те же) передаваемые по умолчанию значения аргументов в определении функции clrscr() компилятор отобразит сообщение об ошибке и не скомпилирует вашу программу.

Несмотря на то что передаваемые по умолчанию аргументы должны быть определены только один раз, для каждой версии перегруженной функции для передачи по умолчанию можно задавать различные аргументы. Таким образом, разные версии перегруженной функции могут иметь различные значения аргументов, действующие по умолчанию.

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

// Неверно!

void f(int а = 1, int b);

Если вы начали определять параметры, которые принимают значения по умолчанию, нельзя после них указывать параметры, задаваемые при вызове функции только явным образом. Поэтому следующее объявление также неверно и не будет скомпилировано.

int myfunc(float f, char *str, int i=10, int j);

Поскольку для параметра i определено значение по умолчанию, для параметра j также нужно задать значение по умолчанию.

Сравнение возможности передачи аргументов по умолчанию с перегрузкой функций

Как упоминалось в начале этого раздела, одним из применений передачи аргументов по умолчанию является "сокращенная форма" перегрузки функций. Чтобы понять это, представьте, что вам нужно создать две "адаптированные" версии стандартной функции strcat(). Одна версия должна присоединять все содержимое одной строки к концу другой. Вторая же принимает третий аргумент, который задает количество конкатенируемых (присоединяемых) символов. Другими словами, эта версия должна конкатенировать только заданное количество символов одной строки к концу другой.

Допустим, что вы назвали свои функции именем mystrcat() и предложили такой вариант их прототипов.

void mystrcat(char *s1, char *s2, int len);

void mystrcat(char *s1, char *s2);

Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги