Функции в C++: руководство для начинающих

обложка статьи

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

Сегодня мы разберем, что такое функции и как правильно их использовать в своей программе. Поехали!

Что такое функции

Функции - это блок кода, который вы можете использовать в любом участке вашей программы неограниченное количество раз. Например, в программе ниже мы выводим 2 строки (без применения функций):

#include <iostream>

using namespace std;

int main() {

    cout << "Функция очень хороший инструмент в программировании"; 
    cout << "С помощью его можно улучшить свой уровень программирования";

system ("pause") 
return 0; 
}

А вот если бы мы использовали функции, то у нас получилось бы так:

#include <iostream>

using namespace std;

void func () {  // функция
  cout << "Функция очень хороший инструмент в программировании";
  cout << "С помощью его можно улучшить свой уровень программирования";
}

int main() {
  func();  // вызов функции

system ("pause")
return 0;
}

Мы хотим, чтобы вы обратили внимание на увеличение количества строк в первой программе при выводе этих двух строк 5 раз.

Как видите, если правильно применять функции, то можно уменьшить программу в несколько раз. Но вы должны помнить - бессмысленно использовать функции без видимых оснований (например, если логика внутри функции слишком специфична).

Вашему компилятору будет совершенно без разницы, использовали вы функции или несколько раз вставили одинаковый блок кода, в итоге он выведет одинаковый результат.

Чтобы понять, как работают локальные переменные (например, переменные в функциях) и глобальные переменные, можете почитать данную статью.

Как создать функции в C++

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

<тип данных, который будет возвращаться функцией> <имя> (<аргументы функции>) {
  < блок 
    кода >
}

Давайте разберем эту конструкцию:

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

Но если мы не собираемся ничего передавать, а например, хотим просто вывести строку, то на месте <тип данных> можно указать тип void. Также вы можете указать тип int, это ни на что не повлияет.

void stroka() {

  cout << "Выводим строку без всяких переменных";

}
  • Имя функции. Нам нужно задать функции имя (исключениями являются зарезервированные слова в C++, имена начинающиеся с цифр, а также имена разделенные пробелом).

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

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

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

void stroka(void) {

  cout << "Просто выводим строку";

}
  • Блок кода. После открывающей скобки идет блок кода, который будет начинать работать при вызове функции.

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

int sum(int b, int c) {  // у нас аргументы функции это b и c

  return a + b;  // он возвращает a + b

}

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

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

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

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

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

stroka();

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

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

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

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

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

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

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

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

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

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

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

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

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
}

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

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

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

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

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

int main() {
    Sum_numbers(1, 2);

    return 0;
}

int Sum_numbers(int a, int b) {
  cout << a + b;
}

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

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

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

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

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

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

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++

Пространство имен в C++ »

Обсуждение