Практическое занятие 9. Функция. Способы передачи параметров в функцию

 

Любую программу можно рассматривать как некую иерар­хическую структуру, состоящую из одной главной программы и множества произвольным образом вызываемых подпрограмм, каждая из которых оформлена в виде отдельного блока (последо­вательности определений и операторов, заключенной в фигурные скобки). Подпрограмма – это именованная последовательность описаний и операторов, выполняющая какое-либо законченное действие. Подпрограмма может принимать параметры и возвра­щать значение. В различных языках программирования подпро­грамма может быть реализована как процедура или функция. Процедура – это подпрограмма, выполняющая определённые действия и завершающаяся без возврата какого-либо значения. Функция – это подпрограмма, выполняющая определённые действия и завершающаяся возвратом значения определённого типа. В С++ все подпрограммы называются функциями. Если функция не возвращает значения, она имеет тип возврата void.

Каждая программа на С/С++ должна включать единственную главную функцию с именем main. Функция main обеспечивает создание точки входа в откомпилированную программу. Кроме функции с именем main в программу может входить произволь­ное количество других функций, выполнение которых иниции­руется прямо или опосредованно вызовами функций из функции main или иных функций.

Каждая функция определяется в глобальной области. Для доступности в модуле функция должна быть в нём определена или объявлена (описана) до первого вызова.

 

Формат определения функции:

 

[класс_памяти] тип имя_функции(

[список_формальных_параметров])

[throw (список_исключений)]

{

// описания и операторы тела функции

}

 

1) класс_памяти – необязательный модификатор, с его помощью можно явно задать область видимости функции:

externглобальная видимость во всех модулях про­граммы (принято по умолчанию);

static – видимость только в пределах программного модуля, в котором определена функция;

2) тип – тип возвращаемого функцией значения, может быть любым, кроме массива и функции (но может быть указате­лем на массив или функцию); если функция не должна возвра­щать значение, то указывается тип void (по умолчанию int);

3) имя_функции – идентификатор; имена функций, как имена внешние (тип extern), должны быть уникальными среди других имён из модулей, в которых используются функции.

4) список_формальных_параметров – это список специ­фикаций отдельных параметров, которые требуется передать в функцию при её вызове; элементы списка разделяются запятыми, для каждого параметра указывается его тип и имя (в объявлении функции имена можно опускать); список может быть пустым, тогда вместо списка в круглых скобках либо указывается void (в стиле С), либо ничего не указывается. Рекомендуется указывать квалификатор const (или const &) перед всеми параметрами, изменение которых в функции не предусмотрено.

Спецификация каждого параметра в списке имеет вид:

тип имя_параметра или

тип имя_параметра = умалчиваемое_значение

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

5) throw (список_исключений) – необязательный элемент определения функции; он задаёт перечень типов исключений, которые разрешается выпускать за пределы функции; если этот элемент опущен, функции разрешается выпускать любые типы исключений (подробно это будет рассмотрено в теме «Обработка исключительных ситуаций»).

6) тело функции – блок; даже если функция не выполняет никаких действий и не возвращает никаких значений, тело функции должно состоять из фигурных скобок { }.

 

Любая функция, возвращающая значение, (не void) может использоваться в качестве операнда выражения.

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

 

Выход из функции

 

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

return выражение; или

return;

 

Выражение в этом операторе определяет возвращаемое функцией значение. Тип возвращаемого значения определяется типом функции. Если функция не возвращает никакого значения, т.е. имеет тип void, то выражение в операторе return опускается. В этом случае необязателен и сам оператор return в теле функции (компилятор добавит его автоматически). Необходимые коды команд возврата в точку вызова компилятор языка С++ добавит в объектный модуль функции автоматически. В теле функции может быть несколько операторов return.

Оператор return используется и в функции main. Если тип возвращаемого функцией main значения отличен от void (по стандарту требуется int), то это значение анализируется операционной системой. Принято, что при успешном завершении программы возвращается значение 0. В противном случае возвращаемое значение отлично от 0.

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


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



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