В этом видео мы с вами узнаем, как писать функции в C++. Прежде, весь код, который мы с вами рассматривали, мы писали внутри функции Main. Конечно же, в C++ можно писать и другие функции. Давайте для начала посмотрим, зачем, вообще, разбивать код на функции. Ну, во-первых, разделение программы на функции упрощает ее понимание. Вы берете кусок кода, даете ему какое-то имя, которое помогает понять, объясняет, что этот кусок кода делает. Это, безусловно, позволяет проще разобраться в программе. Кроме того, выделение кода функции упрощает его повторное использование. Вы взяли какой-то код, вынесли его в функцию и вызвали эту функцию в одном месте. Вы теперь можете взять эту функцию, вызвать ее в другом месте и использовать для решения какой-то другой вашей задачи, что тоже существенно ускоряет написание программ. Наконец, функции – это единственный способ реализации рекурсивных алгоритмов. Итак, давайте посмотрим, как же писать функции в C++. Переключимся в eclipse и вспомним пример, который мы уже рассматривали. Это программа, которая считает сумму двух чисел. Напишем ее: объявим переменные x, y, считаем их из консоли и выведем x + y. Скомпилируем, запустим, убедимся, что все работаем, введем 2 и 3, получили 5, – все, мы написали программу. Давайте теперь вычисление суммы вынесем в отдельную функцию. Что нам для этого надо сделать? Для этого мы напишем функцию Sum, которая принимает два параметра и возвращает их сумму. Как нам теперь этой функцией воспользоваться? Ну мы просто в месте, где она нам необходима, вызовем Sum и передадим туда x и y. Скомпилируем, запустим, введем, например, 3 и 4 и вот получили 7. Программа работает корректно. Значит, на что вам надо обратить внимание? Ну, во-первых, на то, что объявление функции в C++ начинается с типа возвращаемого значения. Мы уже говорили, что C++ – это язык со статической типизацией, и поэтому для функций тоже надо указывать, значение какого типа они возвращают. За типом идет имя функции. После имени в круглых скобках мы перечисляем параметры. Разделяем мы параметры запятой. И здесь важно отметить, что для каждого параметра функции нужно указать его тип. После описания параметров в фигурных скобках идет тело функции, в котором можно выполнять любые команды языка C++. Важно здесь отметить, что для возврата значений из функции используется оператор return. Собственно, вот, мы считаем сумму x + y, и, чтобы вернуть ее из функции, вызываем return. У return есть одна особенность важная, которую надо помнить: он завершает выполнение функции. Давайте рассмотрим пример, который это демонстрирует. Допустим, у нас есть такая задача, у нас есть набор слов, и нужно проверить, входит ли данное слово в этот набор. Давайте оформим это в виде функции. Мы напишем функцию Contains, которая принимает вектор строк (это наш набор слов) и одну строку w, для которой мы и хотим проверить: входит она в набор слов words или нет. Чтобы у нас это компилировалось, нам надо добавить заголовочный файл vector и заголовочный файл string. Значит, обратите внимание, что для функции Contains я использую, в качестве возвращаемого значения, тип bool, потому что она должна только сообщить: есть слово в наборе, или нет его в наборе. Тут достаточно логического типа. Итак, реализуем нашу функцию. Напишем: for (auto s : words) нам надо перебрать все элементы вектора words, поэтому мы используем цикл for. Проверим. Если очередной элемент вектора words равен w, то вернем true. Если мы так и не смогли найти слово, которое равно w, то мы возвращаемся к нашей функции false. Давайте убедимся, что она работает. Допустим, выведем результат запуска функции Contains от набора из слов, например, «воздух», «вода», «огонь», и поищем в этом наборе слово, например, «огонь». Скомпилируем, видим, что программа компилируется, запустим, и мы видим, что в консоль было выведено 1. Мы знаем, что слово «огонь» есть в нашем наборе, поэтому мы знаем, что функция должна вернуть true. И у нас появилась 1, потому что по умолчанию в C++ значения логического типа выводятся как 0 и 1. Собственно, если в качестве слова искомого мы возьмем milk, например, опять же скомпилируем, запустим и мы видим, что вывелось 0, потому что слова milk в нашем наборе нет. Итак, давайте теперь поищем в нашем наборе слово water, «вода». И давайте мы выполним нашу программу в отладчике. Запускаем отладчик. Для этого я нажимаю на иконку «жучка́» в верхней части экрана. У меня запускается отладчик. Все, мы видим, что отладчик запустился и остановился на первой строке нашей программы. Давайте выполним программу до входа внутрь функции Contains. Для этого мы установим курсор на ее первой строке и в меню Clips выберем пункт Run to Line. Все, значит, у нас она выполнилась, мы видим, что седьмая строчка нашей программы подсветилась зеленым, то есть исполнение нашей программы дошло до тела функции Contains. И давайте выполним нашу функцию по шагам. Зайдем в «Цикл». Сейчас у нас будет выполняться сравнение. Мы знаем, что мы ищем строчку water и она не равна air, поэтому мы ожидаем, что при выполнении сравнения, мы не зайдем внутрь тела условного оператора, а перейдем к следующей итерации цикла. Нажмем команду «Сделать шаг» в отладчике и видим, что да, действительно, мы перешли в следующую итерацию цикла. Снова зайдем в тело цикла и теперь мы ожидаем, что сравнение будет успешным, потому что water это второй элемент нашего набора. Выполним. И мы видим, да, мы действительно вошли внутрь цикла. И теперь какая у нас ситуация? У нас цикл наш for должен, вообще, выполнить три итерации, потому что у нас три элемента в векторе. Но на втором мы нашли совпадение, поэтому мы выполняем return и мы видим, что исполнение переместилось в закрывающую скобку тело функции. Собственно, выполнение функции на этом закончилось. И когда мы делаем следующий шаг, то оказываемся уже внутри функции main. Собственно, этот пример вам демонстрирует, что оператор return завершает выполнение функции, независимо от того, какие действия там еще осталось выполнить. Подведем итоги. В этом видео мы узнали, как писать функции в C++. Еще раз поговорили о том, какова польза разбиения программы на функции. Теперь вы знаете синтаксис описания функции. Знаете, что для возврата значения с функции нужно использовать return, и знаете его важную особенность, которая заключается в том, что оператор return завершает выполнение функции.