Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯП_Лекция №6.docx
Скачиваний:
16
Добавлен:
30.08.2019
Размер:
30.04 Кб
Скачать

Перегрузка функций

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

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

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

Примерами функций с переменным числом параметров являются функции из

библиотеки функций языка СИ, осуществляющие операции ввода-вывода информации

(printf,scanfит.п.).

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

Программист может разрабатывать свои функции с переменным числом параметров. Для обеспечения удобного способа доступа к аргументам функции с переменнымчислом параметров имеются три макроопределения (макросы) va_start, va_arg,va_end, находящиеся в библиотекеstdarg.h. Эти макросы указывают на то,что функция, разработанная пользователем, имеет некоторое число обязательныхаргументов, за которыми следует переменное число необязательных аргументов.Обязательные аргументы доступны через свои имена как при вызове обычнойфункции. Для извлечения необязательных аргументов используются макросыva_start, va_arg, va_end в следующем порядке.Макрос va_start предназначен для установки аргумента arg_ptr на началосписка необязательных параметров и имеет вид функции с двумя параметрами:

voidva_start(arg_ptr,prav_param);

Параметр prav_param должен быть последним обязательным параметром вызываемойфункции, а указатель arg_prt должен быть объявлен с предопределением в спискепеременных типа va_list в виде:

va_listarg_ptr;

Макрос va_start должен быть использован до первого использования макроса

va_arg.Макрокоманда va_arg обеспечивает доступ к текущему параметру вызываемойфункции и тоже имеет вид функции с двумя параметрамиtype_argva_arg(arg_ptr,type);Эта макрокоманда извлекает значение типа type по адресу, заданному указателемarg_ptr, увеличивает значение указателя arg_ptr на длину использованногопараметра (длина type) и таким образом параметр arg_ptr будет указывать наследующий параметр вызываемой функции. Макрокоманда va_arg используется столькораз, сколько необходимо для извлечения всех параметров вызываемой функции.Макрос va_end используется по окончании обработки всех параметров функциии устанавливает указатель списка необязательных параметров на ноль (NULL).

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

Рассмотрим применение этих макросов для обработки параметров функции

вычисляющей минимум произвольной последовательности целых чисел.

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

Пример:

#include

intmin(int x1, int x2, int, x3,...);

int main() { }

int minint x1, int x2, int, x3,...)

{

inti=0, minimum=0;

va_listuk_arg;

va_start(uk_arg,x1); /* установка указателя uk_arg на первый необязятельный параметр */

if (x1!=-1) minimum=x1; /* проверка на пустоту списка */

else return 0;

while ( (i=va_arg(uk_arg,int))!=-1) /*выбор очередного значения*/

{

minimum = min(minimum,i) ;

}

va_end(uk_arg); /* закрытие списка параметров */

return (sum/j);

}

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