Возможно, Вы уже знакомы с понятием функций и процедур и встречали их в других языках программирования. Если нет, то кратко опишу, что это такое. Функция в языке C++ - это по сути группа операторов, которые объединены вместе и выполняют какую-то определённую задачу. Функция всегда имеет имя и опционально может иметь входные параметры. Также для функции всегда задаётся тип возвращаемого значения - это тип данных для того результата вычислений, который функция в буквальном смысле возвращает после выполнения группы входящих в неё операторов.
Давайте закрепим в сознании вышесказанное и посмотрим на формат определения функции на псевдоязыке:
Формат определения функции в C++
<тип_возвращаемого_значения_функции>
<имя_функции> ([<опциональный_список_входных_параметров_функции>]) {
<оператор_1>;
<оператор_1>;
...
<оператор_N>;
[return <выражение_для_возврата_результата_функции>;]
}
В квадратных скобках [ и ] заключены опциональные части определения функции - как видим, это список входных параметров (т.е. он может быть, а может отсутствовать), а также оператор return в самом конце определения функции перед закрывающей фигурной скобкой }. В большинстве случаев оператор return является обязательным оператором возврата результата функции: если типом возвращаемого значения для Вашей функции не является void, то Вы обязаны указывать оператор return вместе с тем выражением, которое возвращает функция. Если же Ваша функция имеет тип возвращаемого результата void, то писать оператор return не обязательно.
Каждая программа на C++ должна иметь как минимум одну функцию с именем main(), которая является точкой входа в программу. На усмотрение программиста можно также объявлять и свои собственные функции - с целью структуризации кода программы, группировки операторов программы в отдельные логические части, выполняющие конкретную задачу.
Все операторы, которые заключены между фигурными скобками { и } называются телом функции.
Пример определения функций в программе на C++
Давайте посмотрим на пример определения собственных функций:
#include <iostream>
using namespace std;
// Функция, вычисляющая площадь прямоугольника
double rectangle_area(double side_a, double side_b) {
return side_a * side_b;
}
// Функция, вычисляющая площадь прямоугольного треугольника
double right_triangle_area(double leg_a, double leg_b) {
return 0.5 * leg_a * leg_b;
}
// Функция, вычисляющая площадь параллелограмма
double parallelogram_area(double side_a, double height) {
return side_a * height;
}
// Главная функция, точка входа в программу на C++
int main() {
// Ввод параметров и расчёт площади прямоугольника
double rect_side_a, rect_side_b;
cout << "1. Calculating the area of Rectangle." << endl;
cout << "Enter 'side_a': ";
cin >> rect_side_a;
cout << "Enter 'side_b': ";
cin >> rect_side_b;
// здесь идёт вызов функции rectangle_area
cout << "Area of Rectangle is: " << rectangle_area(rect_side_a, rect_side_b) << endl;
// Ввод параметров и расчёт площади прямоугольного треугольника
double leg_a, leg_b;
cout << "2. Calculating the area of Right Triangle." << endl;
cout << "Enter 'leg_a': ";
cin >> leg_a;
cout << "Enter 'leg_b': ";
cin >> leg_b;
// здесь идёт вызов функции right_triangle_area
cout << "Area of Right Triangle is: " << right_triangle_area(leg_a, leg_b) << endl;
// Ввод параметров и расчёт площади параллелограмма
double para_side_a, para_height;
cout << "3. Calculating the area of Parellelogram." << endl;
cout << "Enter 'side_a': ";
cin >> para_side_a;
cout << "Enter 'height': ";
cin >> para_height;
// здесь идёт вызов функции parallelogram_area
cout << "Area of Parallelogram is: " << parallelogram_area(para_side_a, para_height) << endl;
}
В этом примере мы определили три функции, возвращающие какое-то значение с типом данных double:
- rectangle_area(double side_a, double side_b) - для вычисления площади прямоугольника. Входными параметрами являются длины сторон прямоугольника - side_a и side_b. Если длины сторон прямоугольника равны side_a и side_b, то площадь вычисляется по формуле S = side_a × side_b
- right_triangle_area(double leg_a, double leg_b) - для вычисления площади прямоугольного треугольника. Входными параметрами являются длины сторон катетов leg_a и leg_b. Площадь прямоугольного треугольника равна половине произведения длин его катетов, т.е. S = ½ × leg_a × leg_b
- parallelogram_area(double side_a, double height) - для вычисления площади параллелограмма. Площадь параллелограмма равна произведению его стороны side_a на высоту height, перпендикулярную этой стороне, т.е. S = side_a × height
В основной функции main() запрашивается ввод значений с клавиатуры для всех параметров этих трёх функций и происходит вызов каждой из функции с отображением результата вычисления площади конкретной фигуры на экране консоли.
Ниже показан пример возможного ввода данных и результаты вычисления площадей фигур на основании введённых значений:
1. Calculating the area of Rectangle.
Enter 'side_a': 2.5
Enter 'side_b': 3.5
Area of Rectangle is: 8.75
2. Calculating the area of Right Triangle.
Enter 'leg_a': 5.2
Enter 'leg_b': 3.1
Area of Right Triangle is: 8.06
3. Calculating the area of Parellelogram.
Enter 'side_a': 10
Enter 'height': 3.7
Area of Parallelogram is: 37
Тип возвращаемого значения функции не обязательно должен быть double. Вы можете определить функцию, возвращающую char, int, bool или любой другой поддерживаемый тип данных, включая собственные типы данных, при условии, что Вы определите их в своей программе. То же самое относится к параметрам функций - они могут иметь любые допустимые типы данных - от встроенных в язык C++, до Ваших собственных - опять же, при условии если Вы определите какие-то свои типы данных в программе.
Объявление и определение функции
В программировании на C++ существует два разных термина: объявление и определение функции. Давайте рассмотрим разницу между ними:
- Объявление (англ. declaration) функции говорит компилятору C++ о том, как называется функция, какой у неё возвращаемый тип данных и какие параметры она принимает - т.е. всю информацию о том, как именно вызывать эту функцию. Самое же тело функции может быть определено отдельно от объявления функции (например, в отдельном файле).
- Определение (англ. definition) функции включает в себя помимо имени функции, возвращаемого типа данных и входных параметров также и само тело функции. Таким образом, основная разница между определением функции и объявлением функции заключается в том, что определение сразу содержит и само тело функции. В примере, что мы рассматривали выше у нас было 3 определения функций parallelogram_area, parallelogram_area, parallelogram_area
Типы передачи параметров при вызове функции
Функции в языке C++ могут по-разному принимать значения для своих входных параметров:
- передача параметров по значению
- передача параметров по указателю
- передача параметров по ссылке
Эта тема может занять время и место в статье на объяснение, поэтому пока не буду вдаваться в такие детали. Если моим читателям будет интересно, я напишу про специфику передачи параметров в функции на C++ в отдельной статье. Пока лишь скажу, что в примерах выше мы передавали параметры в наши функции по значению.
Формальные и актуальные параметры функции
Напоследок также скажу, что параметры в определении или в объявлении функции называют ещё формальными параметрами. Когда происходит вызов функции, то в функцию передаются какие-то значения - это могут быть константы, переменные соответствующего типа, выражения или вообще другие функции. Эти значения являются актуальными параметрами в вызове функции. Разницу легко запомнить: формальные называются так оттого, что они формально говорят какие именно типы данных принимает в себя функция и с какими именами и в каком порядке идут параметры функции. Актуальные параметры называются так оттого, что при вызове функции в неё передаются вполне конкретные, т.е. актуальные, значения.
Заключение
В этой статье мы рассмотрели с Вами понятие функции в языке C++, поняли разницу между объявлением и определением функции. Также посмотрели на пример программы, которая использует три различных функции для вычисления площадей геометрических фигур и усвоили, чем формальные параметры функции отличаются от актуальных параметров. За рамки статьи вышла отдельная тема о типах передачи параметров в функции на C++. По возможности и при наличии интереса к этой теме у моих читателей, я напишу отдельную статью про это.
Как говорится, теория бесполезна без подкрепления практикой. Поэтому предлагаю моим читателям выполнить небольшую практику и написать свои функции на языке C++. В качестве упражнения попробуйте написать свои варианты функций, которые вычисляют:
- Площадь круга (формула: S = π × r2, где S - вычисляемая площадь круга, r - это радиус круга, а π - константа, приблизительно равная 3,1415926535)
- Площадь трапеции (формула: S = ½ × (a + b) * h, где S - вычисляемая площадь трапеции, a - длина верхнего основания трапеции, b - длина нижнего основания трапеции, h - высота трапеции).
- Площадь квадрата (формула S = a2, где S - вычисляемая площадь квадрата, a - длина стороны квадрата).
Поделитесь своими результатами или задайте вопросы, если они остались, в комментариях к статье.