Функции (дополнительные возможности)

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

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

Формат прототипа такой функции следующий:

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

Здесь тип — тип возвращаемого функцией значения, список_явных_параметров— список спецификаций отдельных параметров, количество и типы которых фиксированы и известны в момент компиляции. Их можно назвать обязательными. Многоточие извещает компилятор, что дальнейший контроль соответствия количества и типов параметров при обработке вызова функции проводить не нужно.

Один из двух механизмов определения количества и типов параметров предусматривает передачу в функцию значения реального количества фактических параметров. Это выполняется с помощью одного из явно задаваемых (обязательных) параметров. Рассмотрим это на следующем примере(++):

void fun(int,...);

void main()

{ int a1=10, a2=-20, a3=33, a4=-44;

fun(1,a1);

fun(2,a1,a2);

fun(4,a1,a2,a3,a4);

getch();

}

void fun(int k,...)

{ int *p=&k; cout<<"\n There are "<<k<<" arguments\n";

for (int i=1; i<=k; i++)

// или for (; k; k--)

cout<<*(++p)<<" ";

}

В функции fun первый и единственный обязательный параметр k определяет количество действительно используемых при вызове необязательных фактических параметров. Для доступа к списку параметров используется указатель p типа int *. Вначале ему присваивается адрес явно заданного параметра k, то есть он устанавливается на начало списка параметров в памяти. Затем в цикле указатель p перемещается по адресам следующих фактических параметров, соответствующих неявным формальным параметрам. С помощью операции разыменования *p выполняется выборка их значений, которые в данном примере используются для вывода.

Цикл для вывода нескольких значений можно организовать двумя способами. Первый, тривиальный, использует счётчик i. Во втором, более оригинальном способе, параметром цикла является аргумент k, значение которого уменьшается на единицу после каждой итерации. Когда его значение станет нулевым, осуществляется выход из цикла.

Особенность и недостаток такой функции —возможность работы только с фактическими параметрами одного типа (в примере целочисленными), так как указатель p объявляется с одним конкретным типом (у нас int *).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: