Функция - именованный блок кода. Запуск этого кода осуществляется при вызове функции. Функция может получать любое количество аргументов и обычно возвращает результат.
Определение функции состоит из типа возвращаемого значения, имени, списка параметров (аргументов) и тела функции. Параметры определяются в разделяемом запятыми списке, заключенном в круглые скобки. Выполняемые функцией действия определяются в теле функции.
В качестве примера напишем функцию вычисления факториала заданного числа. Факториал числа n является произведением чисел от 1 до n. Эту функцию можно определить следующим образом:
int fact(int value) {
int ret = 1; //локальная переменная
while (val > 1)
ret *= value--; //произведение и декремент
return ret; //возвращение значения
}
Чтобы вызвать функцию fact()
, следует предоставить ей значение типа int
. Результатом выражения также будет int
.
int main() {
int k = fact(5);
cout << "5! = " << k << endl;
return 0;
}
Функции fact()
необходимо предоставить один аргумент, который может быть преобразован в тип int
:
fact("hi"); //ошибка: неправильный тип аргумента
fact(); //ошибка: слишком мало аргументов
fact(10,11); //ошибка: слишком много аргументов
fact(3.14); //правильно: аргумент преобразуется в int
При использовании функции без параметров обычно используют пустой список параметров. Для совместимости с языком С можно также использовать ключевое слово void
, чтобы указать на отсутствие параметров:
void func1 () { /* ... */ } //неявно
void func2 (void) { /* ... */ } //явно
Список параметров состоит из разделяемого запятыми списка параметров, каждый из которых выглядит как одиночное объявление. Даже когда типы двух параметров одинаковы, объявление следует повторить:
int func3(int v1, v2) { /* ... */ } //ошибка
int func4(int v1, int v2) { /* ... */ } //правильно
Параметры не могут иметь одинаковые имена. Локальные переменные, определенные внутри тела функции, не могут использовать имя, совпадающее с именем любого параметра.
В качестве типа возвращаемого значения функции применимо большинство типов. В частности, типом возвращаемого значения может быть void
, это означает, что сама функция не возвращает значение.
Типом возвращаемого значения не может быть массив или функция.
Передача аргумента функции может осуществляться по значению и по ссылке.
В первом случае значение инициализатора копируется, а во втором используется обращение к значению. Лучше использовать ссылки во избежание копирования:
#include <iostream>
using namespace std;
void reset(int &i) {
i = 0; //изменяет значение объекта, на который ссылается i
}
int main() {
int k = 40;
reset(k);
cout << "k = " << k << endl; //выводит k = 0
}