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