Урок #8

Функции и тип без значений

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

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

Вспомните главную функцию main. Без нее ни одна программа на C++ не будет работать. Теперь пора разобраться с описанием функции. Как ранее было замечено, функция имеет тип возвращаемого значения, который стоит перед именем данной функции. Далее идет имя и в нем вы имеете полную свободу, называть можно, как только душа пожелает, но только из букв, цифр и знаков подчеркивания. После имени пишется список аргументов функции. А далее идет само тело. Функция, вычисляющая квадрат числа приведена в примере ниже:

Теперь разберём по порядку саму программу. Функция имеет тип int, что вполне логично, ведь аргумент, который мы передаем на вычисление его квадрата, так же имеет тип int. Строка return res обозначает действие возвращения функцией некого результата. После того, как процесс выполнения программы дошел до инструкции return, он завершает работу текущей функции. Для большей наглядности, после return можно вывести любую строку. Можно заметить, что она никогда не будет выведена в консоль.

Так же можно указывать и несколько передаваемых параметров, которые пишутся через запятую: int first, int second.

Функция может и не возвращать значения. Такие функции называются процедурами. Так же, как и обычные функции, процедуры должны возвращать какое-то значение. Как раз для этого был внедрен тип void, который не имеет значений и обозначает пустоту. return в процедуре так же используется, но только для “экстренного” завершения работы процедуры. Например, нам нужно написать программу, которая выводит первые положительные элементы массива. Функция закончит свою работу, когда будут выведены все элементы массива, либо нам встретится отрицательное число:

25
Для продолжения нажмите любую клавишу…

Как вы могли заметить, массивы в функции передаются таким способом: сперва указывается имя (любое), а затем ставятся двойные квадратные скобки.

Вызов функций

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

Функции в программе вызываются очень просто. Для этого необходимо написать имя функции и передать ей соответствующие параметры. Даже если параметров нет, скобочки после имени указывать обязательно. Типы фактических и формальных параметров должны быть одинаковыми, либо совместимыми. Под совместимыми типами имеется ввиду их преобразования под тип формального параметра. То есть тип short int будет “расширен” до int и потери данных не произойдет. А тип long long — наоборот, будет “сужен” до int, и в этом случае возможна потеря данных.

Определение прототипов функций

Функции не обязательно описывать пред функцией main, но обязательно описать их прототипы, а реализация может находиться хоть до, хоть после функции main. Зачем все-таки определять прототипы? Дело в том, что компилятор должен знать возвращаемое значение и список аргументов функций до её использования в программе. Это относится не только к main, а и ко всем остальным частям кода.

Что бы определить прототип функции, достаточно лишь написать ее шапку с указанием типа возвращаемого значения и типов аргументов. Например, функция возведения числа в квадрат будет иметь такой прототип: int square(int). А программа с данной функцией выглядит так:

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

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

Перегрузка функций имеет под собой одно имя для разных реализаций функции. Возьмем уже хорошо известную нам функцию square. Она реализована таким образом, что может работать лишь с данным типа int. Если же функции передать данные другого типа, то их тип будет изменен на int, что может повлечь за собой потерю данных. Например, тип double, который используется для дробных чисел, потеряет свою дробную часть. Поэтому для возведения в квадрат нам придется сделать другую функцию, которая будет иметь параметры и возвращаемый тип double. Но создавать новую функцию square_double получается слишком затратным, ведь в программе нам придется следить за функциями: где использовать обычный square, а где square_double. Что бы избежать этого, была придумана перегрузка. Как ранее было замечено, перегрузка подразумевает под собой создание функций с одинаковыми именами, но с разными параметрами. Тогда программа, возводящая в квадрат некое число, будет иметь такой вид:

25
1.5625
100000000000000
Для продолжения нажмите любую клавишу…

Возможные вопросы по теме:

Вопросов еще нет

Добавляйте свои вопросы в комментарии. Лучшие попадут в статью 🙂


Урок #7 Урок #9