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

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

Синтаксис определения функции с переменным числом параметров:

тип имя (спецификация_явных_параметров,...){

тело_функции

}

где тип – тип, возвращаемого функцией значения;

имя – имя функции;

спецификация_явных_параметров – список спецификаций параметров, количество и типы которых фиксированы и известны в момент компиляции. Эти параметры можно назвать обязательными.

После списка обязательных параметров ставится запятая, а затем многоточие (...), которое показывает, что дальнейший контроль соответствия количества и типов параметров при обработке вызова функции производить не нужно. При обращении к функции все параметры: и обязательные, и необязательные – будут размещаться в памяти друг за другом. Следовательно, определив адрес обязательного параметра как *p=&k, где p – указатель, а k – обязательный параметр, можно получить адреса и всех остальных параметров: оператор k++; выполняет переход к следующему параметру списка. Еще одна сложность заключается в определении конца списка параметров, поэтому каждая функция с переменным числом параметров должна иметь механизм определения количества и типов параметров. Существует два подхода:

1) известно количество параметров, которое передается как обязательный параметр (см. Пример 1);

2) известен признак конца списка параметров (см. Пример 2).

Пример 1. Найти сумму последовательности чисел, если известно количество чисел.

#include "stdafx.h"

#include <iostream>

using namespace std;

float sum(int k,...);

//явный параметр k задает количество чисел

 

int _tmain(int argc, _TCHAR* argv[]){

cout << "\n4+6=" << sum(2,4,6);

cout << "\n1+2+3+4=" << sum(4,1,2,3,4);

system("pause");

return 0;

}

float sum(int k, ...) {

int *p=&k;//настроили указатель на параметр k

float s=0;

for(;k!=0;k--)

s+=*(++p);

return s;

}

Пример 2. Найти среднее арифметическое последовательности чисел, если известен признак конца списка параметров (цифра ’0’).

#include "stdafx.h"

#include <iostream>

using namespace std;

float arifm(int k, ...);

 

int _tmain(int argc, _TCHAR* argv[]){

cout << "\n(4+6)/2=" << arifm(4,6,0);

cout << "\n(1+2+3+4)/4=" << arifm(1,2,3,4,0);

system("pause");

return 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);

}

 








Дата добавления: 2017-06-02; просмотров: 264;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.006 сек.