Написание функций

Дисциплина «Основы алгоритмизации и программирования»

Функции (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, это ни на что не повлияет.

12345void stroka() {   cout << «Выводим строку без всяких переменных»; }
  • Имя функции. Нам нужно задать функции имя (исключениями являются зарезервированные слова в C++, имена начинающиеся с цифр, а также имена разделенные пробелом).

Лучше всего задавать такое имя, которое будет говорить вам в будущем, за что отвечает эта функция. И тогда в будущем вам не придется  вспоминать, за что она отвечает.

  • Аргументы функции. В скобках (после имени функции) могут находиться аргументы функции. Аргумент функции — это значение, которое можно передать функции при ее вызове. Если аргумент функции не один, а их несколько, то их нужно разделять запятой.
1int sum(int b, int c) {  // у нас аргументы функции это b и c

Если аргументов в функции нет, то в скобках можно указать тип void. Но писать его необязательно, он стоит по умолчанию.

12345void stroka(void) {   cout << «Просто выводим строку»; }
  • Блок кода. После открывающей скобки идет блок кода, который будет начинать работать при вызове функции.

Также, если мы хотим вернуть какое-то значение из функции или вообще прекратить ее работу, то вам понадобится использовать оператор return.

12345int sum(int b, int c) {  // у нас аргументы функции это b и c   return a + b;  // он возвращает a + b }

Если вы не знали main() — это тоже функция.

Как вызывать функцию

Для вызова функций вам нужно использовать такую конструкцию:

1<имя функции> (<аргументы, если они есть>);

Например, выше для вызова функции stroka() (эта функция находится выше) нам нужно использовать такую конструкцию:

1stroka();

Как видите, мы не вписывали аргументы в круглые скобки, так как мы их не указали при создании функции.

Зачем использовать функции

Практически все программисты на текущее время постоянно используют функции, поскольку это экономит их время и позволяет более интенсивно работать. Особенно хорошо отзываются те программисты, которые уже работали над большими проектами, имеющими тысячи строк кода за собой.

Дело в том, что, если вы не используете функции, то программа становится менее мобильной. Например, конкретная ситуация. Вы работаете над проектом и уже написали несколько тысяч строк кода, затем решили изменить вывод сообщения с «Привет!» на «Привет дорогой читатель!». Для этого вам придется найти все строки, в которых происходит вывод сообщения и изменить их все.

А если бы вы использовали функцию, которая выводила сообщение «Привет!», то тогда бы вам пришлось только найти эту функцию и изменить ее!

Перегрузка функций

В С++ вы можете создавать функции с одинаковыми именами. Вы наверно удивлены, что такое вообще возможно так, как если у нас будет 3 функции с одинаковыми именами и мы захотим вызвать одну из этих функций, то мы таким образом вызовем все 3 функции и получится полная каша. Но компилятор думает про это совершенно по-другому.

Все дело в том, что у каждой функции есть свое полное имя(или по-другому сигнатура). Параметры функции — это вся информация о функции. В эту информацию входят:

  • Имя функции.
  • Число аргументов функции.
  • Типы аргументов.

Именно поэтому компилятор считает функции с одинаковыми именами разными, если сигнатуры соответственно тоже разные.

Перегрузка функций — это создание функций с одинаковыми именами, но с разными сигнатурами (полными именами).

В примере ниже все функции разные, хотя и имена у них одинаковые:

123456789101112int func(int a) {  // выполнение функции номер 1 }double func() {  // выполнение функции номер 2}int func(double b, double h) {  // выполнение функции номер 3}long long func(int n, int c, int g) {  // выполнение функции номер 4}

Распространенной ошибкой является мнение, что тип возвращаемого значения функции входит в полное имя функции.

В примере ниже три функции имеют одинаковые типы возвращаемого значения (но полные имена у них совершенно идентичны), и поэтому компилятор начнет ругаться на нас (почему мы создали одинаковые функции!).

123456789int func() { }double func() {  //ошибка: функция с таким именем уже существует}long long func() {  //ошибка: функция с таким именем уже существует}

Прототипы функций

В C++ вы не можете вызвать функцию до объявления самой функции. Все потому, что компилятор не будет знать полное имя функции (имя функции, число аргументов, типы аргументов). Таким образом в примере ниже компилятор сообщит нам об ошибке:

123456789int main() {    Sum_numbers(1, 2);     return 0;} int Sum_numbers(int a, int b) {  cout << a + b;}

Так, при вызове функции Sum_numbers() внутри функции main() компилятор не знает ее полное имя.

Конечно компилятор C++ мог просмотреть весь код и определить полное имя функции, но этого он делать не умеет и нам приходится с этим считаться.

Поэтому мы обязаны проинформировать компилятор о полном имени функции. Для этого мы будем использовать прототип функции.

Прототип функции — это функция, в которой отсутствует блок кода (тело функции). В прототипе функции находятся:

  • Полное имя функции.
  • Тип возвращаемого значения функции.

Вот как правильно должна была выглядеть программа написанная выше:

1234567891011int 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.

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

avatar
  Подписаться  
Уведомление о