Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






 

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

 

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

 

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

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

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

В обоих случаях переход от одного фактического параметра к другому выполняется с помощью указателей (с использованием адресной арифметики).

 

#include " stdafx.h"

#include < iostream>

 

using namespace std;

 

long summa(int k,...)

{

int *pik = & k;

 

long total = 0;

 

for (; k; k--)

total += *(++pik);

 

return total;

}

 

int main(int argc, char* argv[])

{

setlocale(LC_ALL, " Russian");

 

cout < < " \n summa(2, 6, 4) = " < < summa(2, 6, 4);

cout < < " \n summa(6, 1, 2, 3, 4, 5, 6) =" < <

summa(6, 1, 2, 3, 4, 5, 6);

 

return 0;

}

 

Результат

 

summa(2, 6, 4)=10

summa(6, 1, 2, 3, 4, 5, 6)=21

 

Особенность этой программы, что указатель pik может работать только с целочисленными фактическими параметрами.

 

#include " stdafx.h"

#include < iostream>

 

using namespace std;

 

double prod(double arg,...)

{

double result = 1.0;

 

double *prt = & arg;

 

if (*prt == 0.0)

return 0.0;

 

for(; *prt; prt++)

result *= *prt;

 

return result;

}

 

int main(int argc, char* argv[])

{

setlocale(LC_ALL, " Russian");

 

cout < < " \n prod(2e0, 4e0, 3e0, 0e0) = " < < prod(2e0, 4e0, 3e0, 0e0);

cout < < " \n prod(1.5, 2.0, 3.0, 0.0) = " < < prod(1.5, 2.0, 3.0, 0.0);

cout < < " \n prod(1.4, 3.0, 0.0, 16.0, 84.3, 0.0) = " < <

prod(1.4, 3.0, 0.0, 16.0, 84.3, 0.0);

cout < < " \n prod(0e0) =" < < prod(0e0);

 

return 0;

}

 

Результат

 

prod(2e0, 4e0, 3e0, 0e0) = 24

prod(1.5, 2.0, 3.0, 0.0) = 9

prod(1.4, 3.0, 0.0, 16.0, 84.3, 0.0) = 4.2

prod(0e0) = 0

 

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

 

 

Контрольные вопросы

1. Что такое перегрузка функции?

2. Для чего применяется перегрузка функций?

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

4. Каким образом описывается шаблон семейства функций?

5. Что такое рекурсия?

6. Какие виды рекурсии вы знаете?

7. Как описываются функции с переменным количеством параметром?






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.