Функции
Функции, это сущности C++, которые связывают последовательность инструкций (тело функции) с именем и списком из нуля или более параметров функции.
// имя функции: "isodd" // список параметров содержит один параметр, с именем "n" и типом int // возвращаемый тип - bool bool isodd(int n) { // тело функции начинается return n % 2; } // тело функции заканчивается
Когда вызывается функция, например в выражении вызова функции, параметры инициализируются из аргументов (либо предоставленных в месте вызова, либо по умолчанию), а затем выполняются операторы в теле функции. Если список параметров заканчивается на ..., функции могут быть предоставлены дополнительные аргументы, и такая функция называется вариативная функция.
int main() { for(int arg : {-3, -2, -1, 0, 1, 2, 3}) std::cout << isodd(arg) << ' '; // isodd вызывается 7 раз, каж��ый // раз параметр n инициализируется копией из arg }
Неквалифицированные имена функций в выражениях вызова функций ищутся с помощью дополнительного набора правил, называемых "поиск, зависящий от аргументов" (ADL - argument-dependent lookup).
Функция может завершиться возвратом или возбуждением исключения.
Функция может быть сопрограммой, и в этом случае она может приостановить выполнение, чтобы возобновить его позже. |
(начиная с C++20) |
Объявление функции может появиться в любой области, но определение функции может появиться только в области пространства имён или для функции-элемента или дружественной функции, в области видимости класса. Функция, объявленная в теле класса без спецификатора friend, является функцией-элементом класса. Такие функции имеют много дополнительных свойств, подробности смотрите в функции-элементы.
Функции не являются объектами: нет массивов функций, и функции не могут быть переданы по значению или возвращены из других функций. Указатели и ссылки на функции (кроме функции main и большинства стандартных библиотечных функций (начиная с 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). Вместе эти типы известны как FunctionObject, и они повсюду используются в стандартной библиотеке 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)).