Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тема 5 Функции.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
219.14 Кб
Скачать

5.6 Функции специального назначения

C++ поддерживает функции специального назначения. Они включают встроенные функции, void-функции и рекурсивные функции. Встроенные (inline) функции помогают ускорять программу. Void-функции в C++ аналогичны процедурам на других языках программирования. Рекурсивные функции – специальные виды функций, которые вызывают себя сами, пока наконец не получат окончательного результата.

5.6.1 Встроенные функции (inline-функции)

Использование inline-функций может ускорить выполнение программы.

Обработка вызова обычной функции на этапе выполнения программы происходит следующим образом:

– приостанавливается выполнение вызывающей функции и запоминается адрес возврата;

– в стеке выделяется место под параметры вызываемой функции, значения аргументов передаются параметрам, и функция выполняет свою работу;

– если функция является типизированной, то создается временная переменная для хранения возвращаемого значения;

– когда значение возвращено, эта временная переменная уничтожается.

Все это требует времени на выполнение. Ускорение выполнения программы за счет использования inline-функций происходит потому, что на этапе компиляции вызов функции заменяется копией ее тела, а параметры заменяются аргументами, поэтому на этапе выполнения функция на самом деле не вызывается. Однако в тех случаях, когда размер inline-функции достаточно большой и ее вызовы встречаются слишком часто, общий объем программы может сильно увеличиться. Поэтому в качестве inline-функций используются очень маленькие функции, а большие реализуются обычным способом.

Для создания inline-функций используется модификатор inline, который предшествует объявлению функции. Например, создадим встроенную функцию для вычисления квадрата числа:

inline int Sqr( int X)

{ return X * X; }

//---------------------------------------

void main()

{

int X = 5;

int Y = Sqr( X ); // подстановка Y = X * X;

printf( "\n\n Квадрат %lf равен %lf", X, Y );

}

Ключевое слово inline не является командой, оно представляет лишь запрос к компилятору сгенерировать подставляемый код, который не обязательно будет удовлетворен. Например, inline-функции не могут быть рекурсивными или содержать статические локальные переменные. Некоторые компиляторы не подставляют функции, содержащие циклы, операторы switch и goto. Если какое-либо из ограничений нарушено, то компилятор генерирует обычную функцию.

5.6.2 Рекурсивные функции

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

1) должны передавать различные аргументы;

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

Эти два простых правила предотвращают рекурсивную функцию от зацикливания. При этом рекурсия – это такая форма повторения, которая не использует формально какой-либо цикл.

Пример рекурсивной функции для вычисления факториала:

long int Fact( int X)

{

if( X == 1)

return 1; // окончание рекурсии

else

return X * Fact( X – 1); // рекурсивный вызов

}

//---------------------------------

void main()

{

int k = 3;

int F = Fact(k);

printf( "\n Факториал %d равен %d", k, F );

getch();

}

Наглядно работу рекурсивной функции поясняет следующий рисунок:

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

5.7 Новые особенности функций в C++

C++ предлагает новые возможности функций, которых нет в языке С. Эти возможности позволяют назначать аргументы по умолчанию и определять функции, которые имеют одно и то же название (имя).