Функции с переменным числом параметров
В языке С++ допустимы функции, количество параметров у которых при компиляции функции не фиксировано. Кроме того, до вызова функции могут быть неизвестными и типы параметров. Количество и тип параметров становится известным только в момент вызова, когда явно задан список фактических параметров. Каждая функция с переменным числом параметров должна иметь хотя бы один обязательный параметр.
Синтаксис определения функции с переменным числом параметров:
тип имя (спецификация_явных_параметров,...){
тело_функции
}
где тип – тип, возвращаемого функцией значения;
имя – имя функции;
спецификация_явных_параметров – список спецификаций параметров, количество и типы которых фиксированы и известны в момент компиляции. Эти параметры можно назвать обязательными.
После списка обязательных параметров ставится запятая, а затем многоточие (...), которое показывает, что дальнейший контроль соответствия количества и типов параметров при обработке вызова функции производить не нужно. При обращении к функции все параметры: и обязательные, и необязательные – будут размещаться в памяти друг за другом. Следовательно, определив адрес обязательного параметра как *p=&k, где p – указатель, а k – обязательный параметр, можно получить адреса и всех остальных параметров: оператор k++; выполняет переход к следующему параметру списка. Еще одна сложность заключается в определении конца списка параметров, поэтому каждая функция с переменным числом параметров должна иметь механизм определения количества и типов параметров. Существует два подхода:
1) известно количество параметров, которое передается как обязательный параметр (см. Пример 1);
2) известен признак конца списка параметров (см. Пример 2).
Пример 1. Найти сумму последовательности чисел, если известно количество чисел.
#include <iostream.h>
float sum(int k,...);
//явный параметр k задает количество чисел
void main () { //сумма чисел
cout << "\n4+6=" << sum(2,4,6);
cout << "\n1+2+3+4=" << sum(4,1,2,3,4);
}
float sum(int k, ...) {
int *p=&k;//настроили указатель на параметр k
float s=0;
for(;k!=0;k--)
s+=*(++p);
return s;
}
Пример 2. Найти среднее арифметическое последовательности чисел, если известен признак конца списка параметров (цифра ’0’).
#include <iostream.h>
float arifm(int k, ...);
void main () { //среднее арифметическое чисел
cout << "\n(4+6)/2=" << arifm(4,6,0);
cout << "\n(1+2+3+4)/4=" << arifm(1,2,3,4,0);
}
float arifm(int k, ...) {
int *p=&k;//настроили указатель на параметр k
float s=*p; //значение первого параметра присвоили s
int i;
for(i=1;(*p)!=0;i++) //пока нет конца списка
s+=*(++p);
return s/(i-1);
}
Дата добавления: 2015-02-16; просмотров: 634;