Пользовательские функции
Функция — это фрагмент кода, который можно неоднократно вызвать из любого места программы, они позволяют уменьшить избыточность программного кода и повысить его структурированность.
Описание функции состоит из двух частей: объявления и определения. Объявление функции (называемое также прототипом функции) содержит информацию о типе. Используя эту информацию компилятор может найти несоответствие типа и количества параметров. Формат прототипа функции:
<Тип рез> <Назв функции>([<Тип> [<Назв парам1>] [, ..., <Тип> [<Назв парамN>]]]);
Параметр <Тип результата> задает тип значения, которое возвращает функция с помощью оператора return. Если функция не возвращает никакого значения, то вместо типа указывается ключевое слово void. Название функции должно быть допустимым идентификатором. После названия функции, внутри круглых скобок, указывается тип и название параметров через запятую. Названия параметров в прототипе функции можно не задавать вообще, так как компилятор интересует только тип данных и количество параметров. Если функция не принимает параметров, то указываются только круглые скобки Пример объявления функций:
int sum(int x, int y); // или int sum(int, int); void print(const char *str); // или void print(const char *); void print_ok(); // или void print_ok(void);
Определение функции содержит описание типа и названия параметров, а также реализацию. Определение функции имеет следующий формат:
Тип рез> <Назв функции>([<Тип> [<Назв парам1>] [, ..., <Тип> [<Назв парамN>]]])
{ <Тело функции> [return[ <Возвращаемое значение>];
}
В отличие от прототипа в определении функции после типа обязательно должно быть указано название параметра, которое является локальной переменной. Эта переменная создается при вызове функции, а после выхода из функции она удаляется.
Вернуть значение из функции позволяет оператор return. После исполнения этого оператора выполнение функции останавливается и управление передается обратно в точку вызова функции. Если перед названием функции указано ключевое слово void, то оператора return может не быть.
При вызове функции из программы указывается название функции, после которого внутри круглых скобок передаются значения. Если функция не принимает параметров, то указываются только круглые скобки. Если функция возвращает значение, то его можно присвоить переменной или просто проигнорировать.
В качестве примера создадим три разные функции и вызовем их .
#include <iostream> // Объявления функций int sum(int , int );
void print(const char *);
void print_ok(); // или void print_ok(void); int main() { // Вызов функций print("Message"); // Message print_ok(); // OK std::cout<<”x= “;
std::cin>>x;
std::cout<<” y= “;
std::cin>>y;
std::cout << sum(10, 20) << std::endl; // 30 std::cin.get(); return 0; } // Определения функций int sum(int x, int y) { return x + y;} void print(const char *str) { std::cout << str << std::endl;} void print_ok() { std::cout << "OK" << std::endl;}
При увеличении размера программы ее можно разделить на несколько отдельных файлов. Объявления функций выносят в заголовочный файл с расширением h, а определения функций размещают в одноименном файле с расширением cpp. Все файлы располагают в одной папке с основным файлом, содержащим функцию main(). В дальнейшем с помощью директивы #include подключают заголовочный файл во всех остальных файлах. Если в директиве #include название заголовочного файла указывается внутри угловых скобок, то поиск файла осуществляется в системных папках. Если название указано внутри кавычек, то поиск вначале производится в папке с основным файлом, а затем в системных папках.
