Функции. Основные принципы структурной методологии. Принцип формальности. Принцип иерархического упорядочивания, страница 3

·  параметризованные (вызываемые для исполнения с разными аргументами –  фактическими параметрами),

·  рекурсивные  (вызывающие сами себя),

·  библиотечные (встроенные, стандартные) функции,

·  пользовательские функции.

Функция, как единственный вид подпрограммы в С++, описывается замкнутой программной конструкцией, имеющей имя, параметры и тело.

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

Объявление функции (прототип) задает ее имя, тип возвращаемого значения, список передаваемых параметров, необязательный спецификатор памяти (extern, static) и завершается символом «точка с запятой».

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

[класс]   тип_возвр_знач    имя ([список параметров ])  

{тело функции}

С помощью необязательного спецификатора класс можно явно задать область видимости функции, используя ключевые слова extern и static (extern – глобальная видимость во всех модулях программы (по умолчанию); static – видимость только в пределах модуля, в котором определена функция).

Список параметров определяет величины, которые требуется передать в функцию при её вызове. Элементы списка параметров разделяются запятыми. Для каждого параметра указывается его тип и имя (в объявлении (прототипе) имена можно опускать). При каждом новом обращении к функции в нее могут передаваться значения разных переменных. Параметры, перечисленные в заголовке определения функции, называются формальными параметрами, или просто параметрами, а записанные в операторе вызова функции – фактическими параметрами или аргументами.

Обратите внимание, что в С++ (при С-порядке передачи аргументов в функцию) копии аргументов расположатся в стеке в следующем порядке: последний аргумент записывается в стек самым первым, затем в стек помещается предпоследний аргумент и т.д. Напомним, что запись в стек выполняется по адресу, задаваемому парой регистров SS:SP. Так как при записи в стек значение регистра SP физически уменьшается, то в оперативной памяти копия первого аргумента в списке параметров расположена по меньшему адресу памяти, следующий аргумент – по большему адресу и т.д.

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

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

Если функция объявлена без параметров (с пустым списком формальных параметров), то ее вызовом является имя с пустыми скобками за ним. Это предполагает, как правило, использование в функции глобальных переменных.

Если тип возвращаемого функцией значения void, то функция используется в контексте процедуры Паскаля, т.е. вызов ее имеет вид: func(x).

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

A=sin(x);

Вызов функции с одним возвращаемым значением можно записать:

·  в операторе присваивания, например: sd =SUMDIG(1234);

·  непосредственно в операторе if, не присваивая предварительно значение функции переменной (if (SUMDIG(a)>10)…), где a – переменная целого типа;

·  в операторе while, например, while(SUMDIG(a*a)!=num)  или while (SUMDIG(a*a)-num) … и в других операторах;

·  в вызове другой функции в качестве фактического параметра, например, LINE2(SUMDIG(a), 5, ‘.’);