Функции в C++
Возможно, Вы уже знакомы с понятием функций и процедур и встречали их в других языках программирования. Если нет, то кратко опишу, что это такое. Функция в языке C++ — это по сути группа операторов, которые объединены вместе и выполняют какую-то определённую задачу. Функция всегда имеет имя и опционально может иметь входные параметры. Также для функции всегда задаётся тип возвращаемого значения — это тип данных для того результата вычислений, который функция в буквальном смысле возвращает после выполнения группы входящих в неё операторов.
Давайте закрепим в сознании вышесказанное и посмотрим на формат определения функции на псевдоязыке:
Формат определения функции в C++
([ ])
В квадратных скобках [ и ] заключены опциональные части определения функции — как видим, это список входных параметров (т.е. он может быть, а может отсутствовать), а также оператор return в самом конце определения функции перед закрывающей фигурной скобкой >. В большинстве случаев оператор return является обязательным оператором возврата результата функции: если типом возвращаемого значения для Вашей функции не является void, то Вы обязаны указывать оператор return вместе с тем выражением, которое возвращает функция. Если же Ваша функция имеет тип возвращаемого результата void, то писать оператор return не обязательно.
Каждая программа на C++ должна иметь как минимум одну функцию с именем main(), которая является точкой входа в программу. На усмотрение программиста можно также объявлять и свои собственные функции — с целью структуризации кода программы, группировки операторов программы в отдельные логические части, выполняющие конкретную задачу.
Все операторы, которые заключены между фигурными скобками и > называются телом функции.
Пример определения функций в программе на C++
Давайте посмотрим на пример определения собственных функций:
#include 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 > rect_side_a; cout > rect_side_b; // здесь идёт вызов функции rectangle_area cout > leg_a; cout > leg_b; // здесь идёт вызов функции right_triangle_area cout > para_side_a; cout > para_height; // здесь идёт вызов функции parallelogram_area cout
В этом примере мы определили три функции, возвращающие какое-то значение с типом данных double:
- rectangle_area(doubleside_a, doubleside_b) — для вычисления площади прямоугольника. Входными параметрами являются длины сторон прямоугольника — side_a и side_b. Если длины сторон прямоугольника равны side_a и side_b, то площадь вычисляется по формуле S = side_a × side_b
- right_triangle_area(doubleleg_a, doubleleg_b) — для вычисления площади прямоугольного треугольника. Входными параметрами являются длины сторон катетов leg_a и leg_b. Площадь прямоугольного треугольника равна половине произведения длин его катетов, т.е. S = ½ × leg_a× leg_b
- parallelogram_area(doubleside_a, doubleheight) — для вычисления площади параллелограмма. Площадь параллелограмма равна произведению его стороны 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 = π× r 2 , где S — вычисляемая площадь круга, r — это радиус круга, а π — константа, приблизительно равная 3,1415926535)
- Площадь трапеции (формула: S =½ × (a + b) * h, где S — вычисляемая площадь трапеции, a — длина верхнего основания трапеции, b — длина нижнего основания трапеции, h — высота трапеции).
- Площадь квадрата (формула S = a 2 , где S — вычисляемая площадь квадрата, a — длина стороны квадрата).
Поделитесь своими результатами или задайте вопросы, если они остались, в комментариях к статье.
Функции
Функция определяет действия, которые выполняет программа. Функции позволяют выделить набор инструкций и назначить ему имя. А затем многократно по присвоенному имени вызывать в различных частях программы. По сути функция — это именованный блок кода.
Формальное определение функции выглядит следующим образом:
Первая строка представляет заголовок функции. Вначале указывается возвращаемый тип функции. Если функция не возвращает никакого значения, то используется тип void .
Затем идет имя функции, которое представляет произвольный идентификатор. К именованию функции применяются те же правила, что и к именованию переменных.
После имени функции в скобках идет перечисление параметров. Функция может не иметь параметров, в этом случае указываются пустые скобки.
После заголовка функции в фигурных скобках идет тело функции, которое содержит выполняемые инструкции.
Для возвращения результата функция применяет оператор return . Если функция имеет в качестве возвращаемого типа любой тип, кроме void, то она должна обязательно с помощью оператора return возвращать какое-либо значение.
Например, определение функции main, которая должна быть в любой программе на языке C++ и с которой начинается ее выполнение:
Возвращаемым типом функции является тип int , поэтому функция должна использовать оператор return и возвращать какое-либо значение, которое соответствует типу int. Возвращаемое значение ставится после оператора return.
Стоит отметить, что С++ позволяет не использовать оператор return в функции main:
Но если функция имеет тип void , то ей не надо ничего возвращать. Например, мы могли бы определить следующую функцию, которая просто выводит некоторый текст на консоль:
Выполнение функции
Когда запускается программа на языке C++, то запускается функция main. Никакие другие функции, определенные в программе, автоматически не выполняются. Для выполнения функции ее необходимо вызвать. Вызов функции осуществляется в форме:
После имени функции указываются скобки, в которых перечисляются аргументы — значения для параметров функции.
Например, определим и выполним простейшую функцию:
#include void hello() < std::cout int main()
Здесь определена функция hello, которая вызывается в функции main два раза. В этом и заключается преимущество функций: мы можем вынести некоторые общие действия в отдельную функцию и затем вызывать многократно в различных местах программы. В итоге программа два раза выведет строку «hello».
Объявление функции
При использовании функций стоит учитывать, что компилятор должен знать о функции до ее вызова. Поэтому вызов функции должен происходить после ее определения, как в случае выше. В некоторых языках это не имеет значение, но в языке C++ это играет большую роль. И если, к примеру, мы сначала вызовем, а потом определим функцию, то мы получим ошибку на этапе компиляции, как в следующем случае:
#include int main() < hello(); hello(); >void hello()
В этом случае перед вызовом функции надо ее дополнительно объявить. Объявление функции еще называют прототипом. Формальное объявление выглядит следующим образом:
Фактически это заголовок функции. То есть для функции hello объявление будет выглядеть следующим образом:
Используем объявление функции:
#include void hello(); int main() < hello(); hello(); >void hello()
В данном случае несмотря на то, что определение функции идет после ее вызова, но так как функция уже объявлена до ее вызова, то компилятор будет знать о функции hello, и никаких проблем в работе программы не возникнет.