
- •Обзорные лекции по курсу
- •Параметры и аргументы функций
- •Int swap(int, int);
- •Void func();
- •Int MyFunction(int Number, float Point);
- •Int main ()
- •Void Out(double numb, double sig, bool fig)
- •Int. Main ()
- •Void PrintTest(void);
- •Int main о
- •Void PrintTest(void) {
- •Int main ()
- •Int main ()
- •Int main ()
- •Void ChangeFlag(void);
- •Void ChangeFlag(void)
- •Int main()
- •If(Flag)
- •Int Count(void);
- •Int main()
- •Int result;
- •Int Count(void)
- •Volatile short sTest;
- •Volatile const int vciTest;
- •Int main()
- •Int main ()
- •Int main 0
- •Int main()
- •Inline double sqr(double X)
- •Inline double Round(double X)
- •Int swap(int, int);
- •Void func();
- •Int main()
- •Int main 0
- •Упражнения для самопроверки
Volatile short sTest;
Volatile const int vciTest;
Как видно из примера, переменная vciTest с модификатором volatile в то же время может быть объявлена как константа. В этом случае ее значение не сможет меняться в разрабатываемой программе, но может модифицироваться в зависимости от внешних факторов.
Новый стиль заголовков
Исторически так сложилось, что в языке C++ при подключении заголовочных файлов использовался тот же синтаксис, что и в языке С для совместимости с разработанным на тот момент программным обеспечением. Однако при стандартизации языка этот стиль был изменен и теперь вместо заголовочных файлов (как это было в С) указываются некоторые стандартные идентификаторы, по которым компилятор сам находит необходимые файлы. Предопределенные идентификаторы представляют собой имя заголовка в угловых скобках без указания расширения (. h). Ниже приводится пример включения заголовков в стиле C++:
#include <iostream>
#include <stdlib>
#include <new>
Помимо этого, для включения в программу библиотек функций языка С в соответствии с новым стандартом заголовок преобразуется следующим образом: отбрасывается расширение . h и к имени заголовка добавляется префикс с. Таким образом, например, заголовок <string.h> заменяется заголовком <cstring>.Если же используемый компилятор не поддерживает объявления заголовков в новом стиле, можно по-прежнему использовать заголовки в стиле языка С, хотя это и не рекомендуется стандартом C++.
Встраиваемые (inline-) функции
В результате работы компилятора каждая функция представляется в виде машинного кода. Если в программе вызов функции встречается несколько раз, в местах таких обращений генерируются коды вызова уже реализованного экземпляра функции. Однако выполнение вызовов требует некоторой затраты времени.
Если тело функции небольшого размера и обращение к ней в программе происходит довольно часто, на практике можно указать компилятору вместо вызовов функции в соответствующих местах генерировать все ее тело. Осуществляется это с помощью ключевого слова inline. Тем самым увеличивается производительность реализованного кода, хотя, конечно, размер программы может увеличиваться.
Компиляторы различных фирм накладывают свои ограничения на использование встраиваемых функций, поэтому перед использованием inline-функций необходимо обратиться к руководству компилятора.
Ключевое слово inline должно предшествовать первому вызову встраиваемой функции (например, содержаться в ее прототипе).
#include <iostream.h>
// Прототип встраиваемой функции: inline int Sum(int, int);
Int main()
{
int A=2, B=6, C=3;
char eol = '\n';
// Вызовы встраиваемой функции, // генерируют вее тело функции
cout « Sum(А, В) « eol;
cout « Sum(В, С) « eol;
cout « Sum(A, С) « eol;
return 0;
}
int Sum(int x, int y)
{
return x + y;
}
В приведенном примере в каждом месте вызова функции Sum () будет сгенерирован код тела всей функции.
Рекурсивные функции
Как уже упоминалось ранее, функция может вызывать сама себя. При этом говорят, что возник рекурсивный вызов.
Рекурсия бывает:
простой - если функция в теле содержит вызов самой себя;
косвенной - если функция вызывает другую функцию, а та в свою очередь вызывает первую.
При выполнении рекурсии программа сохраняет в стеке значения всех локальных переменных функции и ее аргументов, с тем чтобы в дальнейшем по возвращении из рекурсивного вызова восстановить их сохраненные значения. Рис. 5.3 иллюстрирует поведение рекурсивной функции.
Рис. 5.3. Схема рекурсивного вызова функции
Применять рекурсию следует с осторожностью, так как ее использование для функций, содержащих большое количество переменных или слишком большое число рекурсивных вызовов, может вызвать переполнение стека.Следует также помнить, что при использовании рекурсивного вызова разработчик обязан предусмотреть механизм возврата в вызывающую процедуру, чтобы не произошло образования бесконечного цикла.
Некоторые задачи на практике могут быть проще и нагляднее решены именно с использованием рекурсивных функций. Например, решение тривиальной задачи нахождения факториала без обращения к рекурсии могло бы выглядеть следующим образом:
#include <iostream.h>