Дисциплина «Основы алгоритмизации и программирования»
Функции (functions) в C++: перегрузки и прототипы
Привет, дорогой читатель! Вам, наверное, приходилось в программе использовать один и тот же блок кода несколько раз. Например, выводить на экран одну и ту же строчку. Для того, чтобы каждый раз не писать одинаковый блок кода в C++, присутствуют функции.
Сегодня мы разберем, что такое функции и как правильно их использовать в своей программе. Поехали!
Что такое функции
Функции — это блок кода, который вы можете использовать в любом участке вашей программы неограниченное количество раз. Например, в программе ниже мы выводим 2 строки (без применения функций):
| 123456789101112 | #include <iostream> using namespace std; int main() { cout << «Функция очень хороший инструмент в программировании»; cout << «С помощью его можно улучшить свой уровень программирования»; system («pause») return 0; } |
А вот если бы мы использовали функции, то у нас получилось бы так:
| 123456789101112131415 | #include <iostream> using namespace std; void func () { // функция cout << «Функция очень хороший инструмент в программировании»; cout << «С помощью его можно улучшить свой уровень программирования»;} int main() { func(); // вызов функции system («pause»)return 0;} |
Мы хотим, чтобы вы обратили внимание на увеличение количества строк в первой программе при выводе этих двух строк 5 раз.
Как видите, если правильно применять функции, то можно уменьшить программу в несколько раз. Но вы должны помнить — бессмысленно использовать функции без видимых оснований (например, если логика внутри функции слишком специфична).
Вашему компилятору будет совершенно без разницы, использовали вы функции или несколько раз вставили одинаковый блок кода, в итоге он выведет одинаковый результат.
Чтобы понять, как работают локальные переменные (например, переменные в функциях) и глобальные переменные, можете почитать данную статью.
Как создать функции в C++
Таким образом, чтобы создать функции, нужно использовать конструкцию, которая находится пониже:
| 1234 | <тип данных, который будет возвращаться функцией> <имя> (<аргументы функции>) { < блок кода >} |
Давайте разберем эту конструкцию:
- Тип данных функции. В самом начале нам нужно указать тип данных, который в конечном итоге будет передавать функция.
Но если мы не собираемся ничего передавать, а например, хотим просто вывести строку, то на месте <тип данных> можно указать тип void. Также вы можете указать тип int, это ни на что не повлияет.
| 12345 | void stroka() { cout << «Выводим строку без всяких переменных»; } |
- Имя функции. Нам нужно задать функции имя (исключениями являются зарезервированные слова в C++, имена начинающиеся с цифр, а также имена разделенные пробелом).
Лучше всего задавать такое имя, которое будет говорить вам в будущем, за что отвечает эта функция. И тогда в будущем вам не придется вспоминать, за что она отвечает.
- Аргументы функции. В скобках (после имени функции) могут находиться аргументы функции. Аргумент функции — это значение, которое можно передать функции при ее вызове. Если аргумент функции не один, а их несколько, то их нужно разделять запятой.
| 1 | int sum(int b, int c) { // у нас аргументы функции это b и c |
Если аргументов в функции нет, то в скобках можно указать тип void. Но писать его необязательно, он стоит по умолчанию.
| 12345 | void stroka(void) { cout << «Просто выводим строку»; } |
- Блок кода. После открывающей скобки идет блок кода, который будет начинать работать при вызове функции.
Также, если мы хотим вернуть какое-то значение из функции или вообще прекратить ее работу, то вам понадобится использовать оператор return.
| 12345 | int sum(int b, int c) { // у нас аргументы функции это b и c return a + b; // он возвращает a + b } |
Если вы не знали
main()— это тоже функция.
Как вызывать функцию
Для вызова функций вам нужно использовать такую конструкцию:
| 1 | <имя функции> (<аргументы, если они есть>); |
Например, выше для вызова функции stroka() (эта функция находится выше) нам нужно использовать такую конструкцию:
| 1 | stroka(); |
Как видите, мы не вписывали аргументы в круглые скобки, так как мы их не указали при создании функции.
Зачем использовать функции
Практически все программисты на текущее время постоянно используют функции, поскольку это экономит их время и позволяет более интенсивно работать. Особенно хорошо отзываются те программисты, которые уже работали над большими проектами, имеющими тысячи строк кода за собой.
Дело в том, что, если вы не используете функции, то программа становится менее мобильной. Например, конкретная ситуация. Вы работаете над проектом и уже написали несколько тысяч строк кода, затем решили изменить вывод сообщения с «Привет!» на «Привет дорогой читатель!». Для этого вам придется найти все строки, в которых происходит вывод сообщения и изменить их все.
А если бы вы использовали функцию, которая выводила сообщение «Привет!», то тогда бы вам пришлось только найти эту функцию и изменить ее!
Перегрузка функций
В С++ вы можете создавать функции с одинаковыми именами. Вы наверно удивлены, что такое вообще возможно так, как если у нас будет 3 функции с одинаковыми именами и мы захотим вызвать одну из этих функций, то мы таким образом вызовем все 3 функции и получится полная каша. Но компилятор думает про это совершенно по-другому.
Все дело в том, что у каждой функции есть свое полное имя(или по-другому сигнатура). Параметры функции — это вся информация о функции. В эту информацию входят:
- Имя функции.
- Число аргументов функции.
- Типы аргументов.
Именно поэтому компилятор считает функции с одинаковыми именами разными, если сигнатуры соответственно тоже разные.
Перегрузка функций — это создание функций с одинаковыми именами, но с разными сигнатурами (полными именами).
В примере ниже все функции разные, хотя и имена у них одинаковые:
| 123456789101112 | 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} |
Распространенной ошибкой является мнение, что тип возвращаемого значения функции входит в полное имя функции.
В примере ниже три функции имеют одинаковые типы возвращаемого значения (но полные имена у них совершенно идентичны), и поэтому компилятор начнет ругаться на нас (почему мы создали одинаковые функции!).
| 123456789 | int func() { }double func() { //ошибка: функция с таким именем уже существует}long long func() { //ошибка: функция с таким именем уже существует} |
Прототипы функций
В C++ вы не можете вызвать функцию до объявления самой функции. Все потому, что компилятор не будет знать полное имя функции (имя функции, число аргументов, типы аргументов). Таким образом в примере ниже компилятор сообщит нам об ошибке:
| 123456789 | int main() { Sum_numbers(1, 2); return 0;} int Sum_numbers(int a, int b) { cout << a + b;} |
Так, при вызове функции Sum_numbers() внутри функции main() компилятор не знает ее полное имя.
Конечно компилятор C++ мог просмотреть весь код и определить полное имя функции, но этого он делать не умеет и нам приходится с этим считаться.
Поэтому мы обязаны проинформировать компилятор о полном имени функции. Для этого мы будем использовать прототип функции.
Прототип функции — это функция, в которой отсутствует блок кода (тело функции). В прототипе функции находятся:
- Полное имя функции.
- Тип возвращаемого значения функции.
Вот как правильно должна была выглядеть программа написанная выше:
| 1234567891011 | 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.

Оставить комментарий