Пространства имён
Варианты
Действия

Функции

Материал из cppreference.com
< cpp‎ | language
 
 
 
Функции
Общее
Категории значений (lvalue, rvalue, xvalue)
Порядок оценки (sequence points)
Константные выражения
Потенциально оцениваемые выражения
Первичные выражения
Лямбда-выражения(C++11)
Литералы
Целочисленные литералы
Литералы с плавающей запятой
Логические литералы
Символьные литералы включая управляющие последовательности
Строковые литералы
Литерал нулевого указателя(C++11)
Пользовательский литерал(C++11)
Операторы
a=b, a+=b, a-=b, a*=b, a/=b, a%=b, a&=b, a|=b, a^=b, a<<=b, a>>=b
++a, --a, a++, a--
+a, -a, a+b, a-b, a*b, a/b, a%b, ~a, a&b, a|b, a^b, a<<b, a>>b
a||b, a&&b, !a
a==b, a!=b, a<b, a>b, a<=b, a>=b, a<=>b(C++20)
a[b], *a, &a, a->b, a.b, a->*b, a.*b
a(...), a,b, a?b:c
Выражение new
Выражение delete
Выражение throw
alignof
sizeof
sizeof...(C++11)
typeid
noexcept(C++11)
Выражения свёртки(C++17)
Альтернативные представления операторов
Приоритет и ассоциативность
Перегрузка операторов
Сравнение по умолчанию(C++20)
Преобразования
Неявные преобразования
const_cast
static_cast
reinterpret_cast
dynamic_cast
Явные преобразования: (T)a, T(a)
Пользовательское преобразование
 

Функции, это сущности 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)).