Основы программирования на С++ для начинающих

Функции в C++

Пройдя не такой уж долгий путь от нашего первого урока к этому, вы “подошли” к изучению функций в C++. Функции – это именованный  фрагмент кода, который повторяется в программе 2 или больше раз .  Когда мы пишем функцию, необходимо дать ей имя и в дальнейшем, чтобы её вызвать в программе (из main() или из другой функции), надо обратиться к ней по этому имени.

Мы уже встречали функции в предыдущих уроках. Это функции для строк (символьных массивов) strlen(), strcmp(), функция для генерации случайных чисел rand(). Мы их применяли в программах и, например, передавали в функцию strlen() строку, а она нам возвращала количество символов в этой строке (целое число).

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

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

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

Определить функцию можно двумя способами:

    • до main-функции;
  • после main-функции. В этом случае необходимо до main-функции объявить прототип собственной функции.

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

С использованием прототипа это будет выглядеть так:

Прототип функции размещен в строке 4, а её определение находится в самом низу программы в строках 20 – 25. Что касается выполнения программы: сначала компилятор прочтет прототип. Это даст ему знать о том, что где-то после main() располагается определение этой функции.

Далее начнется выполнение главной функции main(). Выполняться она будет, пока компилятор не встретит имя функции ourFunctionForPrint(). Тогда он найдет определение этой функции, которое расположено после main(), по имени, указанному в прототипе,  выполнит её код, после чего снова вернется к выполнению команд main-функции.

В итоге на экране увидим:

функции в с++, функции c++

Поговорим об  определении функций.

Функции в C++  могут не возвращать никаких значений (как в примере) и могут возвращать какое-либо значение. Если функция не возвращает ничего, то это функция  типа void.

Синтаксис функции, которая не возвращает значений:

функции c++, функции в с++

Имя функции следует давать придерживаясь правил для имен переменных. Единственное – желательно чтобы оно содержало глагол, так как функция выполняет действие. Например если она считает среднее арифметическое можно дать название calculateAverage, если выводит что-то на экран – showText. Имя должно говорить за себя, чтобы не пришлось оставлять лишние комментарии в коде.

Параметры (или аргументы функции) – это данные, которые функция принимает и обрабатывает в теле. Если функции не нужно ничего принимать для обработки, круглые скобки оставляют пустыми. Согласно правилам High Integrity C++ Coding Standard    желательно не определять функции с большим количеством параметров (больше 6).

Рассмотрим пару примеров с функциями, которые принимают параметры и не возвращают значений.

Принимает один параметр:

В 10-й строке кода функция получает параметр – целое число 7. С ним (с этим числом) произойдет то, что описано в определении функции – строки 16 – 22. А именно – это число подставится в заголовок цикла for. Выражение   i < questionCount   станет равнозначным    i < 7 . В итоге мы увидим на экране 7 знаков вопроса.

функции в с++, функции c++

Принимает три параметра:

функции c++, функции в с++

Синтаксис функции, которая возвращает значение:

функции в с++, функции c++

Такие функции отличаются тем, что необходимо указать тип значения, которое вернет функция в результате своей работы. Сам возврат значения в программу оформляется оператором return и это значение программа получит в том месте, где функция была вызвана . return может возвращать переменную, константу или результат выражения (например: return variable1 - variable2; ).  В теле функции могут находиться несколько операторов return. Тогда, работа функции завершится, если сработает какой-то один из этих операторов. Например:

Определение функции располагается в строках 28 – 34. Если пользователь введет +, сработает блок if в строке 30, а в нём соответственно сработает  return d1 + d2;  . После этого код функции уже не будет обрабатываться дальше. Компилятор вернется к выполнению main-функции.

функции c++, функции в с++

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

Еще немного о прототипе: прочитав его до main, компилятор получает сведения  о том, какой тип возвращаемого значения будет у функции (или она вообще не возвращает значения – имеет тип void) и о том, какие параметры будут в неё переданы, в каком количестве и в какой последовательности.

Прототип  int calculateSomeDigits(int d1, int d2, char ch);  говорит компилятору, что функция вернет на место её вызова целое число и о том, что при вызове в нее должно быть передано два целых числа и один символ. При вызове функции, мы должны передать ей столько параметров сколько указано в её заголовке при определении.

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

Синтаксис прототипа функции:

прототип функции в C++

Если параметров несколько – они должны отделяться запятой. Легче всего объявить прототип – это скопировать из определения функции первую строку (заголовок) и после закрывающей круглой скобки добавить точку с запятой.

функции в с++, функции c++, прототип функции

Имена переменных-параметров в прототипе можно не указывать. Следующий прототип равнозначен тому, что выше.

функции в с++, функции c++, прототип функции

На мой взгляд, все же лучше объявлять прототипы функций с указанием имён параметров. Особенно если параметров несколько и они имеют одинаковый тип. Для читаемости и понимания программы так будет лучше.

Чтобы закрепить то, о чём говорили в этой статье, надо попрактиковаться. Смотрите статью с задачами на функции в C++ . В ней вы так же найдете информацию о том, как передавать в функции массивы в виде параметров.  Совет – не просто читайте, а пишите код! Желательно своими силами.

Видео по теме:

24 thoughts on “Функции в C++

  1. Еще в самых первых уроках вы написали, что в конце каждой программы надо писать return = 0 и добавили, что в последующих уроках будет объяснено зачем это делать и для чего вообще куда-то там возвращать ноль. Я думаю, что уже пора бы выполнить обещание. Объясните пожалуйста зачем нужен возврат и почему там может быть не только ноль.Спасибо заранее.

    1. ))) Согласно последним стандартам С++, уже можно не писать return 0; Программа и сама его вернет вне зависимости от того пропишем мы это или нет. Это значит, что она (программа) отработала и закрылась. А вот всевозможные другие значения можно возвращать для того, чтобы отлавливать ошибки в ходе работы программы. Например запрограммировать в функции какое-то условие и если оно не выполнится – вернуть из функции значение -1 (или любое другое), а если выполнится вернуть 1. Далее прописать условие, что если функция вернула -1 – значит произошла ошибка. Вернула 1 – можно продолжать работу (функция отработала нормально).
      Можешь почитать наш урок по Исключениям в С++: https://purecodecpp.com/archives/2044

    2. А return в конце главной функции программы main(), дополню, возвращает итог выполнения всей программы в операционную систему: 0 – успех, не нулевое значение – что-то в программе произошло не так.

      1. Скрипт должен реагировать на изменение цвета на экране, но в строке 11 где первая фигурная скобка autoit пишет что не удается разобрать строку. Помогите пожайлуста

        var x0=0,y0=0,x1=100,y1=100; // фрагмент экрана от 0:0 до 100:100

        var crc0=ait.pixelChecksum(x0,y0,x1,y1);

        while(true)
        {
        WSH.sleep(500); // проверка каждые 0.5 sec
        var crc=ait.pixelChecksum(x0,y0,x1,y1);
        if(crc!=crc0)
        {
        crc0=crc;
        sapi.speak(“Alarm! Picture changed.”) // орет человеческим голосом )
        }
        }

  2. Вообще то, всё относящееся к специфике отображения на экран, к C++ вообще не имеет никакого касательства, и на 100% определяется а).в какой это вы операционной системе … пытаетесь, и б).в каком графическом инструмента, библиотеке, tool-се.

    И в зависимости от этих вариантов а) и б) разных ответов и подсказок может быть миллион.

  3. а) семерка, б) я не могу понять. Через программу autoit должен запускаться этот скрипт. Помогите. Может есть другая программа, которая выполняет такие же функции, дайте ссылку. Может есть программа, которая реагирует на определенный звук?Тоже дайте ссылку если знаете. Помогите пожалуйста.

    1. 1. я не знаю что там в Windows 7 (да и не очень хочу знать)
      2. вопрос ваш не относится никоим боком к программированию на C++ … да и к программированию вообще – это вопрос по конкретным программам и их использованию.
      4. если у вас есть конкретно сформулированные тех. вопросы (чего вы хотите?), да ещё безотносительно к конкретно ОС Windows 7 (как вообще решают такие проблемы?) то можете спрашивать:
      https://toster.ru/my/feed – здесь
      http://rus-linux.net/forum/index.php – или здесь

  4. Спасибо за информацию! А как сделать библиотеку с функциами? Заранее спасибо( Извиняюсь за ошибки, если есть!) )

    1. Хорошо ли вы понимаете что вы хотите, когда говорите “библиотека”?
      1. Вы можете создать отдельно компилируемый объектный файл, содержащий несколько ваших функций, и этот файл будет собираться вместе с вашим приложением.
      2. Вы можете создать статическую библиотеку, которая должна собираться вместе с вашим приложением.
      3. Вы можете создать динамическую библиотеку, разделяемую, DLL, которая должна подгружаться (системой) во время выполнения вашего приложения.

  5. Как можно присвоить результат функции переменной в основной функции?
    Для примера: одна функция при двукратном вызове вернула два результата.
    Как их возможно сравнить?
    Как эти результаты присвоить переменным в основной функции.?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *