Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры по инфе, лучше пересмотреть их!!!!.docx
Скачиваний:
4
Добавлен:
15.04.2019
Размер:
127.67 Кб
Скачать

11. *Пользовательские функции с переменным числом параметров

Язык C++ вслед за С позволяет писать функции с переменным числом параметров. Одним из простых примеров может служить функция, вычисляющая среднее арифметическое своих аргументов. Другой уже классический пример — функция сцепления произвольного количества строк, которая является естественным обобщением функции сцепления двух строк.

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

int f(…)

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

Однако у программиста с написанием таких функций сразу возникают проблемы. Ведь имена параметров отсутствуют! Поэтому доступ можно осуществить только одним способом – косвенным, используя указатель. Вспомним, что все параметры при вызове помещаются в стек. Если мы каким-то образом установим указатель на начало списка параметров в стеке, то, манипулируя с указателем, мы, в принципе, можем «достать» все параметры!

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

int f(int k...)

Ни запятая, ни пробел после параметра не обязательны, хотя можно их и прописать.

Есть одно обстоятельство, которое ограничивает применение таких функций: при написании функции с переменным числом параметров помимо алгоритма обработки программист должен разрабатывать и алгоритм доступа к параметрам. Так что список необъявленных параметров не может быть совсем уж произвольным – в языке C++ не существует универсальных средств распознавания элементов этого списка. Это же означает, что передача аргумента не того типа, который задумывался, или не тем способом, который подразумевался при разработке, приведет к катастрофическим последствиям – компилятор-то ничего не проверяет.

double f(double n, ...) //--заголовок с переменным числом параметров

{ double *p = &n; //--установились на начало списка параметров

double sum = 0, count = 0;

while (*p) //--пока аргумент не равен нулю

{ sum+=(*p); //--суммируем аргумент

p++; //--«перемещаемся на следующий аргумент

count++; //--считаем количество аргументов

}

return ((sum)?sum/count:0); //--вычисляем среднее

12. Параметры функции main(). Привести примеры обращения к параметрам функции main()

int main(int argc, char* argv[]) // параметры функции main()

Эта строка - заголовок главной функции main(), в скобочках объявлены параметры argс и argv.

Параметры функции main

int main (int argc, char * argv[ ] ) argv[ ] – массив символьных строк из командной строки DOS

argv[ 0] – полное имя файла с маршрутом к каталогу, где хранится программа.

argv[ 1] первый параметр после имени программы в командной строке,

argv[ 2] – второй и т.д.

Параметр argc определяет количество параметров в командной строке, не может быть меньше 1