Функция - именованный блок кода. Запуск этого кода осуществляется при вызове функции. Функция может получать любое количество аргументов и обычно возвращает результат.

Определение функции состоит из типа возвращаемого значения, имени, списка параметров (аргументов) и тела функции. Параметры определяются в разделяемом запятыми списке, заключенном в круглые скобки. Выполняемые функцией действия определяются в теле функции.

В качестве примера напишем функцию вычисления факториала заданного числа. Факториал числа 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
}


 Похожие публикации
2016-02-13 • Просмотров [ 393 ]