Функции (functions) в C++: перегрузки и прототипы
Привет, дорогой читатель! Вам, наверное, приходилось в программе использовать один и тот же блок кода несколько раз. Например, выводить на экран одну и ту же строчку. Для того, чтобы каждый раз не писать одинаковый блок кода в C++, присутствуют функции.
Сегодня мы разберем, что такое функции и как правильно их использовать в своей программе. Поехали!
Что такое функции
Функции — это блок кода, который вы можете использовать в любом участке вашей программы неограниченное количество раз. Например, в программе ниже мы выводим 2 строки (без применения функций):
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <iostream> using namespace std; int main() { cout << "Функция очень хороший инструмент в программировании"; cout << "С помощью его можно улучшить свой уровень программирования"; system ("pause") return 0; } |
А вот если бы мы использовали функции, то у нас получилось бы так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <iostream> using namespace std; void func () { // функция cout << "Функция очень хороший инструмент в программировании"; cout << "С помощью его можно улучшить свой уровень программирования"; } int main() { func(); // вызов функции system ("pause") return 0; } |
Мы хотим, чтобы вы обратили внимание на увеличение количества строк в первой программе при выводе этих двух строк 5 раз.
Как видите, если правильно применять функции, то можно уменьшить программу в несколько раз. Но вы должны помнить — бессмысленно использовать функции без видимых оснований (например, если логика внутри функции слишком специфична).
Вашему компилятору будет совершенно без разницы, использовали вы функции или несколько раз вставили одинаковый блок кода, в итоге он выведет одинаковый результат.
Чтобы понять, как работают локальные переменные (например, переменные в функциях) и глобальные переменные, можете почитать данную статью.
Как создать функции в C++
Таким образом, чтобы создать функции, нужно использовать конструкцию, которая находится пониже:
1 2 3 4 |
<тип данных, который будет возвращаться функцией> <имя> (<аргументы функции>) { < блок кода > } |
Давайте разберем эту конструкцию:
- Тип данных функции. В самом начале нам нужно указать тип данных, который в конечном итоге будет передавать функция.
<тип данных>
можно указать тип void
. Также вы можете указать тип int,
это ни на что не повлияет.
1 2 3 4 5 |
void stroka() { cout << "Выводим строку без всяких переменных"; } |
- Имя функции. Нам нужно задать функции имя (исключениями являются зарезервированные слова в C++, имена начинающиеся с цифр, а также имена разделенные пробелом).
- Аргументы функции. В скобках (после имени функции) могут находиться аргументы функции. Аргумент функции — это значение, которое можно передать функции при ее вызове. Если аргумент функции не один, а их несколько, то их нужно разделять запятой.
1 |
int sum(int b, int c) { // у нас аргументы функции это b и c |
Если аргументов в функции нет, то в скобках можно указать тип void
. Но писать его необязательно, он стоит по умолчанию.
1 2 3 4 5 |
void stroka(void) { cout << "Просто выводим строку"; } |
- Блок кода. После открывающей скобки идет блок кода, который будет начинать работать при вызове функции.
return
.
1 2 3 4 5 |
int sum(int b, int c) { // у нас аргументы функции это b и c return a + b; // он возвращает a + b } |
Если вы не знали
main()
— это тоже функция.
Как вызывать функцию
Для вызова функций вам нужно использовать такую конструкцию:
1 |
<имя функции> (<аргументы, если они есть>); |
Например, выше для вызова функции stroka()
(эта функция находится выше) нам нужно использовать такую конструкцию:
1 |
stroka(); |
Как видите, мы не вписывали аргументы в круглые скобки, так как мы их не указали при создании функции.
Зачем использовать функции
Практически все программисты на текущее время постоянно используют функции, поскольку это экономит их время и позволяет более интенсивно работать. Особенно хорошо отзываются те программисты, которые уже работали над большими проектами, имеющими тысячи строк кода за собой.
Дело в том, что, если вы не используете функции, то программа становится менее мобильной. Например, конкретная ситуация. Вы работаете над проектом и уже написали несколько тысяч строк кода, затем решили изменить вывод сообщения с «Привет!» на «Привет дорогой читатель!». Для этого вам придется найти все строки, в которых происходит вывод сообщения и изменить их все.
А если бы вы использовали функцию, которая выводила сообщение «Привет!», то тогда бы вам пришлось только найти эту функцию и изменить ее!
Перегрузка функций
В С++ вы можете создавать функции с одинаковыми именами. Вы наверно удивлены, что такое вообще возможно так, как если у нас будет 3 функции с одинаковыми именами и мы захотим вызвать одну из этих функций, то мы таким образом вызовем все 3 функции и получится полная каша. Но компилятор думает про это совершенно по-другому.
Все дело в том, что у каждой функции есть свое полное имя (или по-другому сигнатура). Параметры функции — это вся информация о функции. В эту информацию входят:
- Имя функции.
- Число аргументов функции.
- Типы аргументов.
Именно поэтому компилятор считает функции с одинаковыми именами разными, если сигнатуры соответственно тоже разные.
Перегрузка функций — это создание функций с одинаковыми именами, но с разными сигнатурами (полными именами).
В примере ниже все функции разные, хотя и имена у них одинаковые:
1 2 3 4 5 6 7 8 9 10 11 12 |
int func(int a) { // выполнение функции номер 1 } double func() { // выполнение функции номер 2 } int func(double b, double h) { // выполнение функции номер 3 } long long func(int n, int c, int g) { // выполнение функции номер 4 } |
Распространенной ошибкой является мнение, что тип возвращаемого значения функции входит в полное имя функции.
В примере ниже три функции имеют одинаковые типы возвращаемого значения (но полные имена у них совершенно идентичны), и поэтому компилятор начнет ругаться на нас (почему мы создали одинаковые функции!).
1 2 3 4 5 6 7 8 9 |
int func() { } double func() { //ошибка: функция с таким именем уже существует } long long func() { //ошибка: функция с таким именем уже существует } |
Прототипы функций
В C++ вы не можете вызвать функцию до объявления самой функции. Все потому, что компилятор не будет знать полное имя функции (имя функции, число аргументов, типы аргументов). Таким образом в примере ниже компилятор сообщит нам об ошибке:
1 2 3 4 5 6 7 8 9 |
int main() { Sum_numbers(1, 2); return 0; } int Sum_numbers(int a, int b) { cout << a + b; } |
Так, при вызове функции Sum_numbers()
внутри функции main()
компилятор не знает ее полное имя.
Конечно компилятор C++ мог просмотреть весь код и определить полное имя функции, но этого он делать не умеет и нам приходится с этим считаться.
Поэтому мы обязаны проинформировать компилятор о полном имени функции. Для этого мы будем использовать прототип функции.
Прототип функции — это функция, в которой отсутствует блок кода (тело функции). В прототипе функции находятся:
- Полное имя функции.
- Тип возвращаемого значения функции.
Вот как правильно должна была выглядеть программа написанная выше:
1 2 3 4 5 6 7 8 9 10 11 |
int Sum_numbers(int a, int b); // прототип функции int main() { Sum_numbers(1, 2); return 0; } int Sum_numbers(int a, int b) { // сама функция cout << a + b; } |
Так, с помощью прототипа мы объясняем компилятору, что полным именем функции является Sum_numbers(int a, int b),
и кроме этого мы говорим компилятору о типе возвращаемого значения, у нас им является тип int
.
Плюсы использования функций
Давайте попробуем сформулировать плюсы использования функций у себя в программе:
- Можно изменить только тело функции и при этом не понадобится искать ее вызов и изменять его, в отличии от использования кода без функций.
- Большое уменьшение количества написания кода.
Лично мы считаем, что использования функций пойдет вам только во благо. Советуем вам начинать использовать функции с начала обучения программированию.
Закрепление функций
Для того чтобы вы, наши дорогие читатели, смогли закрепить данный материал, создайте функцию для подсчета суммы трех чисел. Вызовите эту функцию для вот этих аргументов: 5, 9, 10.
Тест на тему «Функции в C++»
Если эта надпись не исчезает долгое время, попробуйте обновить страницу. Этот тест использует javascript. Пожалуйста, влкючите javascript в вашем браузере.
Надеемся, вам понравилась данная статья. Нам будет приятно, если вы поделитесь данным уроком со своими друзьями. Если вам что-то не понятно в данной статье, ниже вы можете оставить свой комментарий. Удачи!
Было бы очень здорово , если вы составили один раздел ,где вы опубликовывали все библиотеки в с++ и их функции(с описанием). Заранее благодарю.
Когда закончим базовые уроки по C++, создадим такую рубрику. Спасибо за поддержку!