Имена функций подчиняются тем же ограничениям, что и имена переменных.
Введение в мир функций
Всякая задача может быть разбита на подзадачи, каждую из которых можно либо непосредственно представить в виде кода, либо разбить на еще более мелкие подзадачи. Данный метод носит название пошагового уточнения (stepwise refinement). Функции в C++ служат для записи программного кода этих непосредственно решаемых подзадач. Такие функции используются другими функциями, и в конечном счете — функцией main () для решения исходной задачи, с которой, как вы уже знаете, всегда начинает выполняться программа на языке C++. Функции в C++ решают самые разнообразные задачи программирования. Некоторые функции, например getch () и rand (), поставляются в библиотеках. Другие могут быть написаны программистом.
В C++ код, описывающий, что делает функция, называется определением функции (function definition). Формально это выглядит так:
заголовок_функции { инструкции }Все, что стоит перед первой фигурной скобкой, составляет заголовок определения функции, а то, что находится между фигурными скобками, является телом определения функции.
Заголовок функции — это:
тип имя(список_объявлений_параметров)Спецификация типа, стоящая перед именем функции, является возвращаемым типом. Он определяет тип значения, возвращаемого функцией (если оно вообще возвращается). Механизм возврата значений рассмотрим немного позже.
Давайте рассмотрим простейший пример создания своих функций. Вы уже писали свою первую программу, которая выводит на экран надпись “Hello, world!”. А теперь давайте напишем свою функцию, которую назовем Say,и которая выводит надпись “Hello, world!” на экран.
void Say() { cout<<”Hello, world!”; }В определении функции Say() из предыдущего примера список параметров пуст, то есть объявлений параметров нет. Тело функции состоит из единственной инструкции cout, которая выводит на экран приветствие “Hello, world!”.
В примере в заголовке функции Say() тип возвращаемого значения функции стоит void, с этим типом Вы встречаетесь впервые. Так вот, тип void применяется только для функций и для указателей, которые мы будем рассматривать немного позже; переменные типа void Вы объявлять не можете, компилятор Вам сразу же выведет ошибку. Если Вы указываете тип возвращаемого значения как void (то есть “пусто”) это означает, что Ваша функция не будет возвращать никакого значения. В предыдущем примере функция только выводила надпись на экран и все, то есть никаких значений она возвращать не должна, поэтому тип у нее и указан как void.
В последующем при создании своих функций внимательно разберите что Ваша функция будет делать и для чего она предназначена, определите будет ли функция возвращать какое-либо значение и, если будет, то какое, и после этого только укажите тип возвращаемого значения функции. Например, если Вам вдруг придется написать свою функцию, которая вычисляет косинус числа, то Вы для себя определяете, что функция косинуса должна принять число с плавающей точкой в списке параметров, для этого числа найти значение косинуса, которое тоже будет числом с плавающей точкой, и вернуть это значение туда, откуда функция вызывалась. То есть для данного примера тип функции должен быть float,так как необходимо будет вернуть число с плавающей точкой.
Синтаксически параметры — это идентификаторы, они могут использоваться внутри тела функции. В списке объявлений параметров параметры указываются через запятую. Иногда параметры в определении функции называют формальными параметрами. Тем самым подчеркивается их сущность: формальные параметры — это то, вместо чего будут подставлены фактические значения, передаваемые функции в момент ее вызова. После вызова функции значение аргумента, соответствующее формальному параметру и передаваемое при вызове функции, используется в теле выполняемой функции. В C++ такие параметры являются вызываемыми по значению (call-by-value). Когда применяется вызов по значению, переменные передаются функции как аргументы, их значения копируются в соответствующие параметры функции, а сами переменные не изменяются в вызывающем окружении. В сущности, вызываемые по значению параметры являются локальными в своей функции. Им могут передаваться выражения, значения которых присваиваются этим локальным переменным (параметрам).
Давайте рассмотрим небольшой пример создания функции, которая принимает некоторые параметры. Вы уже знаете, что оператора возведения в квадрат в языке C++ нет, и если какое-то значение нужно возвести в квадрат, то необходимо записывать это значение (например, какую-то переменную) умноженную на себя. Это не совсем удобно. Поэтому давайте напишем свою функцию, которая вычисляет квадрат какого-либо целочисленного значения и сообщает результат.
int square (int a) { return a*a; }Как видите, функция square() принимает один целочисленный параметр a, в который будет передаваться значение из вызывающей функции, которое необходимо возвести в квадрат. Тип возвращаемого значения для функции
square()- int, то есть функция должна будет вернуть целочисленное значение в вызывающую функцию, что и делает инструкция return с параметром a, в котором хранится результат работы функции (квадрат значения параметра a).
Как вы уже, наверно, догадались строка void main() есть объявление функции с именем main, и которая ничего не возвращает и ничего не принимает в списке параметров. А все программы, которые вы до сих пор писали между фигурных скобок после строки void main(), есть не что иное, как тело функции main.
Так вот, любой код вашей программы должен обязательно находиться в теле какой-либо функции (между фигурных скобок после заголовка функции), и не может “висеть” где-нибудь вне функций.
Еще одно существенное замечание: нельзя определять какую-либо функцию в теле другой функции.