Вызов функций
Чтобы функция выполнилась, её нужно вызвать: написать её имя, затем круглые скобки и точку с запятой, потому что вызов функции — это инструкция. Функцию вызывают из тела main:
#include <iostream>
void sayHello() {
std::cout << "Привет!" << std::endl;
std::cout << "Хорошего дня!" << std::endl;
}
int main() {
sayHello();
}Эта программа выводит:
Привет!
Хорошего дня!Когда программа, выполняя main, доходит до вызова функции, она переходит в функцию, выполняет её тело сверху вниз, а затем продолжает с инструкции после вызова. Функцию можно вызывать сколько угодно раз:
#include <iostream>
void sayHello() {
std::cout << "Привет!" << std::endl;
}
int main() {
std::cout << "Старт" << std::endl;
sayHello();
sayHello();
std::cout << "Конец" << std::endl;
}Эта программа выводит:
Старт
Привет!
Привет!
КонецПрограмма начинается в main: выводит Старт, дважды выполняет тело sayHello и в конце выводит Конец. Функция, которую никто не вызывает, не выполняется никогда.
Компилятор читает программу сверху вниз, и функция, которую вы вызываете, должна быть ему уже известна. Поэтому мы определяем функции выше main. В этой программе функция находится ниже main:
#include <iostream>
int main() {
sayHello();
}
void sayHello() {
std::cout << "Привет!" << std::endl;
}Программа не компилируется, и в выводе вы видите такую ошибку:
main.cpp:4:5: error: use of undeclared identifier 'sayHello'
4 | sayHello();
| ^~~~~~~~
1 error generated.В сообщении об ошибке сказано, что в строке 4 используется имя sayHello, которое ещё не объявлено (о нём ещё не сообщили компилятору). Когда компилятор дошёл до строки 4, он ничего не знал о функции, которая стоит ниже main. Если перенести функцию целиком выше main, всё заработает.
В программах из интернета вы иногда увидите выше main только первую строку функции с точкой с запятой на конце, например void sayHello();, а саму функцию целиком — ниже main. Такая строка называется объявлением: она сообщает компилятору, что функция существует. Так тоже работает, но на этом курсе мы пишем функции целиком выше main.
Остерегайтесь ещё двух частых ошибок:
- Нет круглых скобок.
sayHello;без скобок не вызывает функцию. Программа компилируется, но функция не выполняется, и ничего не выводится. - Другое имя. Имя в вызове должно в точности совпадать с именем в определении, включая заглавные и строчные буквы.
SayHello();заканчивается ошибкойerror: use of undeclared identifier 'SayHello'; did you mean 'sayHello'?
Задание
- 1
В теле
mainвызовите функциюfirstFunctionтри раза. - 2
Добавьте в тело
firstFunctionвторую инструкцию, которая выводитКак здорово, что есть функции!. Запустите программу: каждый из трёх вызовов теперь выводит обе строки. Вы изменили код в одном месте, а все три вызова стали делать что-то новое. Именно для этого и нужны функции.