Функции
Описание (определение) функции содержит заголовок и тело функции.
Вид заголовка:
<тип_возвращаемого_значения> <имя_функции> (<список параметров>)
Тело: { <операторы тела функции> }
Если функция имеет возвращаемое значение, то функция содержит хотя бы один оператор return <выражение>;
Если функция не имеет возвращаемого значения, то есть имеет тип void, для выхода из функции при необходимости может быть использован оператор return;, который обычно отсутствует.
Параметры функции
Передача по значению: в стек заносятся копии значений аргументов (фактических параметров).
Передача по адресу (по ссылке): в стек заносятся копии адресов аргументов, а функция осуществляет доступ к ячейкам памяти по этим адресам и может изменить исходные значения аргументов.
Передача параметра по ссылке:
<имя_типа> & <имя_параметра> (как var в языке Паскаль)
Пример 1. Функция вычисления суммы двух целых чисел.
int Sum(int a,int b)
{return a+b;}
Пример 2. Функция сравнения двух целых чисел.
bool Eq(int a,int b)
{return a==b;}
Пример 3. Функция обмена значениями двух переменных:
void Swap(int &a, int &b)
{ int c;
c=a; a=b; b=c;
}
Возможно использование модификатора const запрета изменения внутри функции.
Оператор прототипа (объявление функции)
Прототип описывает компилятору интерфейс функции. Он сообщает компилятору тип возвращаемого значения функции, а также количество и типы аргументов. Компилятор получает возможность:
– правильно обрабатывать возвращаемое значение функции;
– следить за числом аргументов функции;
– контролировать применение корректных типов данных для аргументов функции.
Прототип функции является оператором, поэтому он должен завершаться точкой с запятой.
Примеры операторов прототипа:
int Sum(int a,int b);
void Swap(int &a, int &b);
В прототипе можно опускать имена переменных, вполне достаточно списка типов:
int Sum(int, int);
void Swap(int &, int &);
Обработка прототипов осуществляется во время компиляции и относится к категории статического контроля типов. Статический контроль типов позволяет обнаружить многие ошибки из числа тех, которые намного труднее выявить во время выполнения программы.
!!! Сигнатура функции – прототип без указания типа функции.
Пример 4. Вычислить y=max (a, b)
#include <iostream.h>
using namespace std;
int max(int a, int b)
{ if (a > b) return a;
else return b;
}
int main()
{ int a, b, y;
cin >> a >> b;
y=max(a, b);
cout << "\ny="
<< y<<'\n';
return 0;
}
#include <iostream.h>
using namespace std;
int max(int, int);
int main()
{ int a, b;
cin >> a >> b;
cout << "\nmax="
<< max(a, b)<<'\n';
return 0;
}
int max(int a, int b)
{
return (a > b)? a:b;
}
Рекурсивные функции
Пример 5. Функция вычисления значения факториала.
long fact (long n)
{if (n==0 || n==1)
return 1;
return n*fact(n-1);
}
long fact (long n) {
return(n>1)? n*fact(n-1):1;
}
Рекурсивные функции
Пример 6. Вычислить
void SumRec(int n,float &S)
{
if (n==1) S=1;
else
{ SumRec(n-1,S);
S+=1.0/n;
}
}
float SumRec(int n)
{
if (n==1) return 1;
return SumRec(n-1)+1.0/n;
}
Функции стандартной библиотеки
В стандартной библиотеке находятся определения типов, констант, макросов и функций.
Для использования с помощью директивы #include в исходный текст программы включаются заголовочные файлы, в которых находятся соответствующие объявления.
Сами функции подключаются на этапе компоновки.
Заголовочные файлы | Функции |
<math.h> (<cmath>) | математические функции |
<string.h> | работа со строками в стиле C |
и другие
int abs(int i) абсолютное значение i
double fabs(double x) абсолютное значение x