7. Функции

We use cookies. Read the Privacy and Cookie Policy

7. Функции

Мы рассмотрели, как объявлять переменные (глава 3), как писать выражения (глава 4) и инструкции (глава 5). Здесь мы покажем, как группировать эти компоненты в определения функций, чтобы облегчить их многократное использование внутри программы. Мы увидим, как объявлять и определять функции и как вызывать их, рассмотрим различные виды передаваемых параметров и обсудим особенности использования каждого вида. Мы расскажем также о различных видах значений, которые может вернуть функция. Будут представлены четыре специальных случая применения функций: встроенные (inline), рекурсивные, написанные на других языках и объявленные директивами связывания, а также функция main(). В завершение главы мы разберем более сложное понятие – указатель на функцию.

7.1. Введение

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

inline int abs( int obj )

{

// возвращает абсолютное значение iobj

return( iobj

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

вызова. Если функция принимает параметры, при ее вызове должны быть указаны

фактические параметры, аргументы. Их перечисляют внутри скобок, через запятую.

В следующем примере main() дважды вызывает abs() и по одному разу min() и gcd().

Функция main() определяется в файле main.C.

#include

int main()

{

// прочитать значения из стандартного ввода

cout i;

if ( !cin ) {

cerr j;

if ( !cin ) {

cerr

Вызов функции может обрабатываться двумя разными способами. Если она объявлена

встроенной (inline), то компилятор подставляет в точку вызова ее тело. Во всех

остальных случаях происходит нормальный вызов, который приводит к передаче управления

ей, а активный в этот момент процесс на время приостанавливается. По завершении

работы выполнение программы продолжается с точки, непосредственно следующей

за точкой вызова. Работа функции завершается выполнением последней инструкции

ее тела или специальной инструкции return.

Функция должна быть объявлена до момента ее вызова, попытка использовать необъявленное

имя приводит к ошибке компиляции. Определение функции может служить ее объявлением,

но ему разрешено появиться в программе только один раз. Поэтому обычно его помещают

в отдельный исходный файл. Иногда в одном файле находятся определения нескольких

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

файле, необходим механизм, позволяющий объявить ее, не определяя.

Объявление функции состоит из типа возвращаемого значения, имени и списка параметров.

Вместе эти три элемента составляют прототип. Объявление может появиться в файле

несколько раз.

В нашем примере файл main.C не содержит определений abs(), min() и gcd(), поэтому

вызов любой из них приводит к ошибке компиляции. Чтобы компиляция была успешной,

их необязательно определять, достаточно только объявить:

int abs( int );

int min( int, int );

int gcd( int, int );

(В таком объявлении можно не указывать имя параметра, ограничиваясь названием типа.)

Объявления (а равно определения встроенных функций ) лучше всего помещать в заголовочные файлы, которые могут включаться всюду, где необходимо вызвать функцию. Таким образом, все файлы используют одно общее объявление. Если его необходимо модифицировать, изменения будут локализованы. Вот так выглядит заголовочный файл для нашего примера. Назовем его localMath.h:

// определение функции находится в файле gcd.С

int gcd( int, int );

inline int abs(int i) {

return( i0 ? -i : i );

}

inline int min(int vl.int v2) {

return( vlv2 ? vl : v2 );

}

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

При выполнении наша программа main.C, получив от пользователя значения:

Введите первое значение: 15

Введите второе значение: 123

выдаст следующий результат:

mm: 15

НОД: 3