Вызов функций (C++)
Оператор вызова функции, записываемый при помощи скобок, является бинарным оператором.
primary-expression ( expression-list )
Заметки
В этом контексте primary-expression является первым операндом, а expression-list (список аргументов, который может быть пустым) — вторым. Оператор вызова функции используется для операций, для которых необходимо определенное количество параметров. Такой подход действует, потому что expression-list представляет собой не отдельный операнд, а список. Оператор вызова функции должен представлять собой нестатическую функцию-член.
Перезагрузка оператора вызова функции не меняет способ вызова функций; она лишь изменяет способ интерпретации оператора при применении к объектам заданного типа класса. К примеру, приведенный ниже код в обычных условиях не имеет смысла.
Point pt;
pt( 3, 2 );
Однако, если оператор вызова функции был соответствующим образом перегружен, то этот синтаксис может использоваться для сдвига координаты x на три единицы, а координаты y — на две. Такое определение приводится в следующем примере.
// function_call.cpp
class Point
{
public:
Point() { _x = _y = 0; }
Point &operator()( int dx, int dy )
{ _x += dx; _y += dy; return *this; }
private:
int _x, _y;
};
int main()
{
Point pt;
pt( 3, 2 );
}
Обратите внимание, что оператор вызова функции применяется к имени объекта, а не к имени функции.
Перегрузку оператора вызова функции также можно выполнить, используя указатель на функцию (вместо самой функции).
typedef void(*ptf)();
void func()
{
}
struct S
{
operator ptf()
{
return func;
}
};
int main()
{
S s;
s();//operates as s.operator ptf()()
}