Функции
Функции — это сущности C++, которые связывают последовательность операторов (тело функции) с именем и списком нуля или более параметров функции.
// function name: "isodd"
// parameter list has one parameter, with name "n" and type int
// the return type is bool
bool isodd(int n)
{ // the body of the function begins
return n % 2;
} // the body of the function endsКогда функция вызывается, например, в выражении вызова функции, параметры инициализируются из аргументов (предоставленных в месте вызова или по умолчанию), и операторы в теле функции выполняются. Если список параметров заканчивается ..., к функции можно передать дополнительные аргументы; такая функция называется функцией с переменным числом аргументов.
int main()
{
for (int arg : {-3, -2, -1, 0, 1, 2, 3})
std::cout << isodd(arg) << ' '; // isodd called 7 times, each
// time n is copy-initialized from arg
}Неквалифицированные имена функций в выражениях вызова функций находятся с использованием дополнительных правил, называемых "поиском, зависящим от аргументов" (ADL).
Функция может завершиться возвратом или броском исключения.
| Функция может быть корутиной, в этом случае она может приостановить выполнение, чтобы возобновить его позже. | (с C++20) |
Объявление функции может появляться в любом области видимости, но определение функции может появляться только в области видимости пространства имён или, для членных и дружественных функций, в области видимости класса. Функция, объявленная в теле класса без спецификатора friend, является членом класса. Такие функции имеют множество дополнительных свойств; см. члены класса для получения подробностей.
Функции не являются объектами: нет массивов функций, и функции не могут передаваться по значению или возвращаться из других функций. Разрешены указатели и ссылки на функции (кроме главной функции и большинства функций стандартной библиотеки(с C++20)), и они могут использоваться там, где сами эти функции не могут. Поэтому мы говорим, что эти функции «адресуемые».
Каждая функция имеет тип, который состоит из типа возвращаемого значения функции, типов всех параметров (после преобразований «массив в указатель» и «функция в указатель», см. список параметров) , является ли функция noexcept или нет(с C++17), и, для нестатических членов функции, cv-квалификацию и ref-квалификацию(с C++11). Типы функций также имеют языковую связь. Нет cv-квалифицированных типов функций (не путать с типами cv-квалифицированных функций таких как int f() const; или функций, возвращающих cv-квалифицированные типы, такие как std::string const f();). Любой cv-квалификатор игнорируется, если он добавлен к псевдониму для типа функции.
Несколько функций в одной области видимости могут иметь одинаковое имя, если их списки параметров и, для нестатических членов функций, cv/ref(с C++11)-квалификации отличаются. Это известно как перегрузка функций. Объявления функций, которые различаются только типом возвращаемого значения и спецификацией noexcept(с C++17), не могут быть перегружены. Адрес перегруженной функции определяется по-другому.
| C++ реализует безымянные функции с помощью лямбда-выражений. | (с C++11) |
Функции-объекты
Помимо lvalue функций, выражение вызова функции поддерживает указатели на функции и любые значения типа класса, которые перегружают оператор вызова функции или могут быть преобразованы в указатель на функцию (включая лямбда-выражения)(с C++11). Вместе эти типы известны как Функции-объекты, и они повсеместно используются в стандартной библиотеке C++, см., например, использование BinaryPredicate и Compare.
Стандартная библиотека также предоставляет ряд предопределённых шаблонов функций-объектов, а также методы для создания новых (включая std::less, std::mem_fn, std::bind, std::function(с C++11), std::not_fn(с C++17), std::bind_front(с C++20), std::bind_back, std::move_only_function(с C++23), std::copyable_function, и std::function_ref(с C++26)).
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/language/functions