Пример перегрузки функций
Приведем пример функции S1 с двумя параметрами х, у, работающая в зависимости от типа передаваемых аргументов, следующим образом:
– если тип параметров целочисленный, функция S1 складывает их значения и возвращает полученную сумму;
– если тип параметров long, функция S1 перемножает их значения и возвращает полученное произведение;
– если тип параметров вещественный, функция S1 делит их значения и возвращает частное от деления.
# include <stdio.h>
int S1 (int x, int y) {
return x+y;
}
long S1 (long x, long y) {
return x*y;
}
double S1 (double x, double y) {
return x/y;
}
int main ()
{
int a = 1, b = 2, c;
long i = 3, j = 4, k;
double x = 10, y = 2, z;
c=S1(a, b);
k=S1(i, j);
z=S1(x, y),
printf("\n c = %d; k = %ld; z = %lf . \n", c, k, z);
return 0;
}
В результате получим:
c = 3; k = 12; z = 5.000000 .
Функции с переменным числом параметров
Многоточие в списке параметров пользовательской функции используется тогда, когда число аргументов заранее неизвестно. При этом неопределенное количество параметров можно указать в ее прототипе следующим образом:
void f1(int a, double b, …);
Такая запись указывает компилятору на то, что за обязательными фактическими аргументами для параметров a и b могут следовать, а могут и не следовать другие аргументы при вызове этой функции.
Перечислим основные особенности использования данного механизма.
1. Используется несколько макрокоманд для доступа к параметрам таких функций, это:
va_list и va_start – макрокоманды подготовки доступа к параметрам;
va_arg – использование параметров;
va_end – отчистка перед выходом.
Они объявлены в заголовочном файле stdarg.h.
2. Такая функция должна иметь минимум один параметр (именованный) для передачи ей количества передаваемых аргументов.
3. Для макроса va_start необходимо передать два аргумента – имя списка параметров, который задает va_list и их количество.
4. Нарушать указанный порядок макрокоманд нельзя. Иначе можно получить непредсказуемые последствия.
5. Для макроса va_arg нужно помимо имени списка параметров передать и предполагаемый тип. При несоответствии типов – ошибка.
Использование многоточий полностью выключает проверку типов параметров. Многоточие необходимо, только если изменяются и число параметров, и их тип.
Следующий пример иллюстрирует эту возможность.
#include <stdarg.h>
#include <stdio.h>
void f1(double s, int n ...) {
int v;
va_list p;
va_start(p, n);
printf(" \n Double S = %lf ", s);
for(int i=1; i<=n; i++) {
v = va_arg(p, int);
printf("\n Argument %d = %d ", i, v);
}
va_end(p);
}
void main(void) {
f1(1.5, 3, 4, 5, 6);
}
В результате получим:
Double S = 1.500000
Argument 1 = 4
Argument 2 = 5
Argument 3 = 6
Press any key to continue
Шаблоны функций
Дата добавления: 2017-10-04; просмотров: 1105;