Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LektsiiS.doc
Скачиваний:
81
Добавлен:
13.04.2015
Размер:
815.1 Кб
Скачать

10 Еще о функциях

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

Бывают функции с параметрами, заданными по умолчанию. Например, функция вывода числа в заданной системе счисления

void print(int N, int q=10);

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

print(1995, 2);

или один

print(1995);

В этом случае число будет выведено в десятичной системе счисления.

10.2 Произвольное число параметров

Для некоторых функций нельзя заранее предвидеть число и тип параметров вызова. Такие функции объявляют, завершая список параметров многоточием “...” . Например,

int printf (const char* ...);

Тем самым говорится, что в вызове printf должен быть, по меньшей мере, один параметр char*, а остальные — не обязательны.

Чтобы обработать нефиксированные аргументы функции, применяют макросы va_arg, va_end, и va_start, определенные в заголовочном файле stdarg.h. Внешне вызов макроса похож на вызов функции, подробнее о макросах будет сказано в конце раздела.

void va_start(

va_list ap, // массив информации о нефиксированных аргументах

lastfix // имя последнего фиксированного аргумента

) — устанавливает указатель на первый из списка нефиксированных аргументов, переданных в функцию. Функция с неопределенным числом параметров автоматически определяет указатель va_list ap.

type va_arg(

va_list ap,

type // тип очередного аргумента

) — расширяется выражением, имеющим тот же тип и значение, что очередной нефиксированный аргумент. Запрещено использовать типы char и float.

void va_end(va_list ap) — обеспечивает нормальный возврат из вызванной функции.

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

Р е ш е н и е.

#include <stdarg.h>

int sum(int number, ...)

{

va_list ap;

int total = 0;

va_start(ap, num);

for (int i = 1; i <= number; i++)

total += va_arg(ap,int);

va_end(ap);

return total;

}

З а д а ч а. Определить функцию,

void con(char* buf, int limit, ...)

присоединения к строке, находящейся в buf, других строк.

Р е ш е н и е.

#include <string.h>

#include <stdarg.h>

void con(char* buf, int limit, ...)

{

char *p;

va_list ap;

va_start(ap, limit);

while (p = va_arg(ap, char*))

if (strlen(buf) + strlen(p) < limit)

strcat(buf, p);

va_end(ap);

return;

}

10.3 Неиспользуемые параметры

Иногда, в результате модификации кода функции, надобность в некоторых параметрах отпадает. Чтобы не лишать работоспособности те программы, которые вызывают функцию, ее определяют с неиспользуемыми параметрами. Например,

void func(int P1, int) { // тело функции }

Второй параметр не используется.

10.4 Перегруженные функции

Использование одного имени для обозначения различных действий над данными различных типов называется перегрузкой.

Пример.

void print(int); // печать целого

void print(char*); // печать строки

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

Выбор делается по следующим правилам.

1) выбирается функция, чьи параметры точно согласуются с параметрами вызова;

2) для согласования достаточно приведения целых типов: char к int, short к int, а также float к double;

3) для согласования достаточно стандартного приведения типов;

4) для согласования достаточно приведения типов, определяемого пользователем;

5) согласование использует многоточие (...) в определении функции.

Если согласовать параметры по этим правилам нельзя, вызов функции квалифицируется как ошибочный.

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