В приведенной выше программе осталось невыясненной роль выражения square(i)
. Это i
. Функция — это именованная последовательность инструкций. Она может возвращать результат, который также называется
В стандартной библиотеке предусмотрено множество полезных функций, таких как функция для вычисления корня квадратного из числа sqrt()
, использованная в разделе 3.4. Однако многие функции мы пишем самостоятельно. Рассмотрим возможное определение функции square
.
int square(int x) // возвращает квадрат числа x
{
return x*x;
}
Первая строка этого определения утверждает, что это функция (об этом говорят скобки), которая называется square
, принимающая аргумент типа int
(с именем) и возвращающая значение типа int
(тип результата всегда предшествует объявлению функции); иначе говоря, ее можно использовать примерно так:
int main()
{
cout << square(2) << '\n'; // выводим 4
cout << square(10) << '\n'; // выводим 100
}
Мы не обязаны использовать значение, возвращаемое функцией, но обязаны передать функции именно столько аргументов, сколько предусмотрено. Рассмотрим пример.
square(2); // возвращаемое значение не используется
int v1 = square(); // ошибка: пропущен аргумент
int v2 = square; // ошибка: пропущены скобки
int v3 = square(1,2); // ошибка: слишком много аргументов
int v4 = square("two"); // ошибка: неверный тип аргумента —
// ожидается int
two
", вы на самом деле имели в виду число 2
. Однако компилятор языка С++ совсем не так умен. Компьютер просто проверяет, соответствуют ли ваши инструкции синтаксическим правилам языка С++, и точно их выполняет. Если компилятор станет угадывать, что вы имели в виду, то он может ошибиться и вы — или пользователи вашей программы — будете огорчены. Достаточно сложно предсказать, что будет делать ваша программа, если компилятор будет пытаться угадывать ваши намерения.
Тело функции является блоком (см. раздел 4.4.2.2), который выполняет реальную работу.
{
return x*x; // возвращаем квадрат числа x
}
Для функции square
эта работа тривиальна: мы вычисляем квадрат аргумента и возвращаем его в качестве результата. Выразить это на языке С++ проще, чем на естественном языке. Это типично для простых идей. Помимо всего прочего, язык программирования предназначен именно для простого и точного выражения таких простых идей.
Синтаксис определения функции можно описать так:
тип идентификатора (список параметров) тело функции
За типом (возвращаемого значения) следует идентификатор (имя функции), за ним — список параметров в скобках, затем — тело функции (исполняемые инструкции). Список аргументов, ожидаемых функцией, называют списком параметров, а элементы этого списка — параметрами (или формальными аргументами).
Список параметров может быть пустым. Если не хотите возвращать результат, то перед именем функции в качестве типа возвращаемого значения следует поставить ключевое слово void
(означающее “ничего”). Рассмотрим пример.
void write_sorry() // не принимает никаких аргументов;
// ничего не возвращает
{
cout << "Извините \n";
}
Специфические аспекты, связанные с языком программирования, будут описаны в главе 8.
4.5.1. Зачем нужны функции
• Эти вычисления логически отделены от других.
• Отделение вычислений делает программу яснее (с помощью присваивания имен функциям).
• Функцию можно использовать в разных местах программы.
• Использование функций упрощает отладку программы.