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

    int sum(int a,  int b,  int с = 0,  int d = 0);

    Подобное объявление sum() позволяет вызывать ее не только с двумя, но и с
большим числом аргументов — до четырех. Значения по умолчанию должны идти
последними в списке параметров функции и могут появляться только в прототипе
функции. Если не указаны аргументы для с и d, то они замещаются значениями по
умолчанию, указанными в прототипе функции. Теперь допустимы следующие операторы:

    cout « sum(1,  2);		// а == 1,  b == 2,   с == 0,  d == О
    cout « sum(1.  2,  3);	// а == 1,  b == 2,  с == 3,  d == О
    cout « sum(1,  2, 3, 4);	// а == 1, b == 2, с == 3, d == 4

    Листинг 12.14 показывает более реальный пример функции с аргументами по
умолчанию. Программа центрирует введенную строку путем ее копирования в
строковый буфер вывода, обрамленной одним или двумя символами заполнения.
Можно использовать функцию CenterO программы-примера для подготовки строк вида:

    «*** Error: You goofed big time! **** «<«« Press any key to continue >»»»

    Скомпилируйте CENTER. CPP из листинга 12.14 как Easy Win- или
DOS-приложение. Запустите программу и введите строку, выводящуюся несколькими
способами функцией CenterO, которая заодно демонстрирует использование
аргументов по умолчанию.

    Листинг 12.14.  CENTER.CPP (использование аргументов функции по умолчанию)

    1:      #include <iostream.h>
    2:      #include <string.h>
    3:
    4:      #define SIZE 128
    5:
    6:      void Center(const char *instr, char «outstr,
    7:                           int width = 0, char IFill = '-', char rFill = '-');
    8:
    9:      main()
    10:     {
    11:     char instr[SIZE]; // Вводимая строка
    12:     char outstr[SIZEJ; // Выводимая строка
    13:     int length; // Длина строки в символах
    14:
    15:     cout « "Enter a string:";
    16:     cin.getline(instr, SIZE / 2);
    17:     length = strlen(instr);
    18:
    19:     Center(instr, outstr);
    20:     cout « outstr « '\n';
    21:     Center(instr, outstr, length + 8);
    22:     cout « outstr « '\n';
    23:     Center(instr, outstr, length + 16, '*', '*');
    24:     cout « outstr « '\n';
    25:     Center(instr, outstr, 78, '<', '>');
    26:     cout « outstr « '\n';
    27:
    28:     return 0;
    29:     }
    30:
    31:     // instr: Указатель на входную строку
    32:     // outstr: Указатель на выходную строку
    33:     // width: Окончательная желаемая длина выходной строки
    34:     // fill: Символ для заполнения выходной строки
    35:
    36:     void Center(const char *instr,  char *outstr,
    37:                           int width, char IFill, char rFill)
    38:     {
    39:     if (outstr == 0) // Выходная строка не должна быть нулевой
    40:        return;           // Если нулевая - немедленное возвращение
    41:
    42:     if (instr == 0) { // Если входная строка нулевая,
    43:          *outstr = 0; // Выводим пустую строку
    44:                             // и возвращаемся. }
    45:          return;
    46:     }
    47:     // Вычисление .переменных для заполнения выходной строки



    296     Часть III. Программирование на ANSI C++ 
