関数呼び出し (C++)Function Call (C++)

かっこを使用して呼び出される関数呼び出し演算子は二項演算子です。The function-call operator, invoked using parentheses, is a binary operator.

構文Syntax

primary-expression ( expression-list )

解説Remarks

このコンテキストでは、primary-expression は最初のオペランドであり、expression-list (空の可能性がある引数リスト) は 2 番目のオペランドです。In this context, primary-expression is the first operand, and expression-list, a possibly empty list of arguments, is the second operand. 関数呼び出し演算子は、多数のパラメーターを必要とする演算で使用されます。The function-call operator is used for operations that require a number of parameters. これが機能するのは、expression-list が単一オペランドではなくリストであるためです。This works because expression-list is a list instead of a single operand. 関数呼び出し演算子は、非静的メンバー関数である必要があります。The function-call operator must be a nonstatic member function.

関数呼び出し演算子は、オーバーロードしたとき、関数をどのように呼び出すかを変更するのではなく、特定のクラス型のオブジェクトに適用されるときに演算子をどのように解釈するかを変更します。The function-call operator, when overloaded, does not modify how functions are called; rather, it modifies how the operator is to be interpreted when applied to objects of a given class type. たとえば、次のコードは、通常、無意味です。For example, the following code would usually be meaningless:

Point pt;
pt( 3, 2 );

ただし、適切にオーバーロードされた関数呼び出し演算子を指定すると、この構文を使用して x 座標の 3 つの単位と y 座標の 2 つの単位をオフセットできます。Given an appropriate overloaded function-call operator, however, this syntax can be used to offset the x coordinate 3 units and the y coordinate 2 units. 次のコードは、そのような定義を示しています。The following code shows such a definition:

// 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 );
}

関数呼び出し演算子は、関数の名前ではなく、オブジェクトの名前に適用されることに注意してください。Note that the function-call operator is applied to the name of an object, not the name of a function.

関数へのポインター (関数そのものではなく) を使用して関数呼び出し演算子をオーバーロードすることもできます。You can also overload the function call operator using a pointer to a function (rather than the function itself).

typedef void(*ptf)();
void func()
{
}
struct S
{
   operator ptf()
   {
      return func;
   }
};

int main()
{
   S s;
   s();//operates as s.operator ptf()()
}

参照See also

演算子のオーバーロードOperator Overloading