ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 5) онлайн

Аргументы по умолчанию

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

Чтобы продемонстрировать использование аргументов, задаваемых по умол- чанию, приведем пример, являющийся модификацией программы OVERLOAD. В программе OVERLOAD мы использовали три различные функции с одним име- нем, чтобы обрабатывать различные типы передаваемых значений. Следующая программа, MISARG, достигает того же эффекта, но другим путем:

// missarg.cpp

// применение аргументов по умолчанию #include  <iostream> using namespace std;

void repchar(char='*', int=45); // прототип с аргументами

                // по умолчанию

int main() {

repchar();           // печатает символ '*' 45 раз

repchar('=');      // печатает символ '=' 45 раз

repchar('+', 30);               // печатает символ '+' 30 раз

return 0;

}

//--------------------------------------------------------

// функция repchar() // печатает строку символов

void repchar(char ch, int n)  // при необходимости будут {              // использоваться значения по умолчанию

for(int j=0; j<n; j++)       // цикл n раз

cout << ch;         // вывод ch

cout << endl;

}

В этой программе функция repchar() имеет два аргумента. Ее вызов произ- водится из функции main() три раза: первый раз — без аргументов, второй раз — с одним аргументом, третий раз — с двумя аргументами. Первые два вызова рабо- тают потому, что вызываемая функция имеет значения аргументов по умолча- нию, которые используются в том случае, если при вызове значение аргумента не передается. Значения аргументов по умолчанию определяются в прототипе функции repchar();

void repchar(char='*', int=45); // прототип

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

void repchar(char reptChar='*', int numberReps=45);

Если при вызове функции число переданных аргументов на единицу мень- ше, чем описано в прототипе, то компилятор считает, что отсутствует последний аргумент. Таким образом, в случае вызова функции repchar() с одним аргумен- том значение этого аргумента присваивается параметру ch, а параметру n при- сваивается значение по умолчанию, равное 45.

Если при вызове repchar() отсутствуют оба аргумента, то обоим ее парамет- рам, ch и n, будут присвоены значения по умолчанию, соответственно равные '*'

и 45. Таким образом, все три вызова функции repchar() будут корректными, не- смотря на то, что количество аргументов в них различно.

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

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

 

28