Functions
Функции — это сущности C++, которые связывают последовательность statements ( function body ) с name и списком из нуля или более function parameters .
// имя функции: "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 }
Unqualified имена функций в выражениях вызова функций ищутся с дополнительным набором правил, называемым "argument-dependent lookup" (ADL) .
Функция может завершиться возвратом или выбрасыванием исключения .
|
Функция может быть корутиной , и в этом случае она может приостанавливать выполнение для последующего возобновления. |
(since C++20) |
Объявление функции может находиться в любой области видимости, но определение функции может находиться только в области видимости пространства имен или, для member и friend функций, в области видимости класса. Функция, объявленная в теле класса без спецификатора friend, является функцией-членом класса. Такие функции имеют множество дополнительных свойств, подробности смотрите в разделе member functions .
Функции не являются объектами: не существует массивов функций, и функции не могут передаваться по значению или возвращаться из других функций. Указатели и ссылки на функции (за исключением функции main и большинства функций стандартной библиотеки (начиная с C++20) ) разрешены и могут использоваться там, где сами эти функции не могут. Поэтому мы говорим, что эти функции являются "адресуемыми".
Каждая функция имеет тип, который состоит из возвращаемого типа функции, типов всех параметров (после преобразований массив-в-указатель и функция-в-указатель, см.
список параметров
)
, является ли функция
noexcept
или нет
(начиная с C++17)
, и, для нестатических функций-членов, cv-квалификации
и ref-квалификации
(начиная с C++11)
. Типы функций также имеют
языковую линковку
. Не существует cv-квалифицированных типов функций (не следует путать с типами
cv-квалифицированных функций
, таких как
int
f
(
)
const
;
или функций, возвращающих
cv-квалифицированные типы
, таких как
std::
string
const
f
(
)
;
). Любая cv-квалификация игнорируется, если она добавлена к псевдониму для типа функции.
Несколько функций в одной области видимости могут иметь одинаковое имя, при условии что их списки параметров и, для нестатических функций-членов, cv /ref (since C++11) -квалификации различаются. Это известно как перегрузка функций . Объявления функций, которые отличаются только типом возвращаемого значения и спецификацией noexcept (since C++17) не могут быть перегружены. Адрес перегруженной функции определяется особым образом.
|
C++ реализует анонимные функции с помощью лямбда-выражений . |
(since C++11) |
Функциональные объекты
Помимо lvalue-выражений функций, выражение вызова функции поддерживает указатели на функции, а также любое значение классового типа, которое перегружает оператор вызова функции или может быть преобразовано в указатель на функцию (включая lambda-expressions ) (since C++11) . В совокупности эти типы известны как FunctionObject s , и они повсеместно используются в стандартной библиотеке 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) ).