Определение и объявление функций


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

Формальное определение функции выглядит следующим образом:

1
2
3
4
тип имя_функции(параметры)
{
инструкции
}
Первая строка представляет заголовок функции. Вначале указывается возвращаемый тип функции. Если функция не возвращает никакого значения, то используется тип void.

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

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

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

Для возвращения результата функция применяет оператор return. Если функция имеет в качестве возвращаемого типа любой тип, кроме void, то она должна обязательно с помощью оператора return возвращать какое-либо значение.

Например, определение функции main, которая должна быть в любой программе на языке C++ и с которой начинается ее выполнение:

1
2
3
4
int main()
{
return 0;
}
Возвращаемым типом функции является тип int, поэтому функция должна использовать оператор return и возвращать какое-либо значение, которое соответствует типу int. Возвращаемое значение ставится после оператора return.

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

1
2
3
4
void hello()
{
std::cout << "hello\n";
}
Выполнение функции
Для выполнения функции ее необходимо вызвать. Вызов функции осуществляется в форме:

1
имя_функции(аргументы);
После имени функции указываются скобки, в которых перечисляются аргументы - значения для параметров функции.

Например, определим и выполним простейшую функцию:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>

void hello()
{
std::cout << "hello\n";
}

int main()
{
hello();
hello();
return 0;
}
Здесь определена функция hello, которая вызывается в функции main два раза. В этом и заключается преимущество функций: мы можем вынести некоторые общие действия в отдельную функцию и затем вызывать многократно в различных местах программы. В итоге программа два раза выведет строку "hello".

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

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>

int main()
{
hello();
hello();
return 0;
}

void hello()
{
std::cout << "hello\n";
}
В этом случае перед вызовом функции надо ее дополнительно объявить. Объявление функции еще называют прототипом. Формальное объявление выглядит следующим образом:

1
тип имя_функции(параметры);
Фактически это заголовок функции. То есть для функции hello объявление будет выглядеть следующим образом:

1
void hello();
Используем объявление функции:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>

void hello();

int main()
{
hello();
hello();
return 0;
}

void hello()
{
std::cout << "hello\n";
}
В данном случае несмотря на то, что определение функции идет после ее вызова, но так как функция уже объявлена до ее вызова, то компилятор уже будет знать о функции hello, и никаких проблем в работе программы не возникнет.