Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Konspekt_S__Chast_2.doc
Скачиваний:
31
Добавлен:
09.02.2015
Размер:
1 Mб
Скачать

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

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

Рассмотрим пример:

void F (int I, double D, char C = ’a’, int J = 10)

{

cout << C << “ “ << J << endl;

}

int main ()

{

F (0, 3.14); // Результат: а 10

F (0, 3.14, ’G’); // Результат: G 10

F (0, 3.14, ’G’, 1000); // Результат: G 1000

}

В этом примере в функции Fпоследние два параметра определены как параметры по умолчанию.

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

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

  1. все параметры по умолчанию должны находиться в конце списка параметров функции;

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

Функции с переменным числом параметров

Одним из представителей подобных функций является, например, функция printf (), используемая в языкахCиC++ для вывода данных:

void main()

{

int a = 10, b = 20;

char *str = "Это текст";

printf("a = %d, с = %s, b = %d", a, str, b);

}

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

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

1. При разработке тела функции необходимо использовать макросы для работы со списками аргументов функций. Для их использования в программу необходимо включить заголовочный файл <stdarg.h>:

#include <stdarg.h>

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

double Summa (int N, …)

Здесь в списке параметров присутствует один обязательный параметр N, за которым могут следовать необязательные параметры. Необязательные параметры должны всегда находиться в конце списка параметров.

3. В теле функции необходимо определить переменную для работы со списком параметров (тип данных этой переменной va_listопределен в<stdarg.h>), значение которой инициализируют с помощью макросаva_start(он также принадлежит<stdarg.h>). Перед завершением работы функции необходимо (обязательно!) с помощью макросаva_endочистить стек программы от необязательных параметров функции:

{

va_list L; // Объявляем переменную для списка параметров

va_start (L, N); // Инициализируем переменную списка параметров

……….

va_end (L); // Очищаем стек

return ………;

}

Макрос va_startимеет два параметра. Первый – это переменная списка параметров. Второй – имя последнего обязательного параметра функции (параметра, который находится в списке параметров непосредственно перед необязательными параметрами).

4. Получение очередного параметра из списка необязательных параметров осуществляется с помощью макроса va_arg (), например, так:

double R = 0;

for (int I = 0; I < N; ++ I)

R += va_arg (L, double);

Параметрами макроса va_arg являются переменная списка параметров и тип данных очередного параметра из списка.

Приведенные выше “заготовки” приводят нас к функции, выполняющей суммирование Nвещественных значений:

#include <iostream>

#include <stdio.h>

#include <stdarg.h>

using namespace std;

double Summa (int N, …)

{

va_list L; // Объявляем переменную для списка параметров

va_start (L, N); // Инициализируем переменную списка параметров

double R = 0;

for (int I = 0; I < N; ++ I)

R += va_arg (L, double); // Добавляем кRочередной аргумент

va_end (L); // Очищаем стек

return R;

}

int main ()

{

cout << Summa (3, 10.0, 20.0, 30.0) << endl; // 60

cout << Summa (5, 10.0, 20.0, 30.0, 40.0, 50.0) << endl; // 150

return 0;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]