Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга C++.doc
Скачиваний:
24
Добавлен:
10.11.2019
Размер:
2.48 Mб
Скачать

Прототипы функций

Язык C++ позволяет использовать прототипы функций. По сути, возвращаемый тип, идентификатор функции и типы параметров с обязательной точкой с запятой в конце составляют прототип функции. Прототип функции (function prototype) — это объявление функции, но не ее определение. Благодаря явному объявлению возвращаемого типа и списка типов аргументов, в C++ при обращении к функции возможны строгая проверка типов и неявные преобразования типов.

Итак, функция может быть объявлена до того, как она определена. Определение функции может идти позже в этом же файле, браться из библиотеки или из указанного пользователем файла. Прототип функции имеет следующую форму:

тип имя(список_объявлений_аргументов);

список_объявлений_ аргументов может быть пустым, содержать единственное объявление или несколько объявлений, разделенных запятыми. Если функция не имеет параметров, допускается использование ключевого слова void. В C++ функ­ция с пустым списком параметров выглядит как имя_функции(). Такая информация позволяет компилятору отслеживать совместимость типов. Аргументы преобразуются к указанным в объявлении типам так же, как в случае присваивания.

Рассмотрим пример прототипа функции min, которая принимает два целочисленных параметра, находит минимальное из них и возвращает его

int min(int, int) ;

И возвращаемый тип функции, и типы аргументов в списке указываются явно. Определение функции min () должно соответствовать этому объявлению. Прототип функции может также содержать имена аргументов. В случае min () это могло бы выгля­деть так:

int min(int x, int у);

В C++ используется эллипсический символ (ellipsis) (...) для обозначения списка аргументов, который не указан, но подразумевается. Функция printf () из стандартной библиотеки stdio.h имеет следующий прототип:

int printf(const char* cntrl_str, ...);

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

//Сложение трех целых — иллюстрация прототипов функций

#include <iostream.h>

int add3(int, int, int);

double average(int);

void main()

{

int score_l, score_2, score_3, sum;

cout << "\nEnter three marks: ";

cin >> score_l >> score_2 >> score_3;

sum = add3(score_l, score_2, score_3);

cout << "\nSum= " << sum;

cout << "\n Average= " << average(sum);

sum = add3(1.5 * score_l, score_2, 0.5 * score_3);

cout << "\nWeight sum= " << sum << ".";

cout << "\nWeight average= " << average(sum) << "." << "\n";

}

int add3(int a, int b, int с)

{ return (a + b + с); }

double average(int s)

{ return (s / 3.0); }

Разбор программы

int add3(int, int, int) ;

double average(int);

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

sum = add3(1.5 * score_l, score_2, 0.5 * score_3);

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

int add3(int a, int b, int с)

{

return (а + b + с) ;

}

Это собственно определение функции. Оно соответствует объявлению прототипа функции перед main ().

Так как список аргументов в прототипе функции может включать имена переменных,

int add3(int а, int b, int с) ;

тоже допустимо.