Функции
Функции — это сущности 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). Все эти типы вместе называются функциональными объектами (FunctionObjects) и повсеместно используются в стандартной библиотеке 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/cpp/language/functions