operator()的含义?

时间:2011-04-05 19:29:57

标签: c++ operator-overloading

C ++中operator()的含义是什么?我看到它经常用于“仿函数”或比较器等功能对象。但那么这些函数怎么称呼?在其他情况下有用吗?我可以为这样的运算符声明多少个参数?例如,以下是否可以接受?

bool operator() (Foo f, Baz b, Quz q, Oik o) {...}

5 个答案:

答案 0 :(得分:4)

假设您有一个函数对象类Func,其中定义了operator()。如果您有该类的实例,则只需在引用该实例的表达式后面放置括号:

Func myFunc;
myFunc(); // Calls the operator() member function

作为标准库中的一个例子,我们可以查看std::less这是一个二元函数对象:

std::less<int> myLess; // Create an instance of the function object
std::cout << myLess(5, 6) << std::endl; // Is 5 less than 6?

operator()的另一个常见用途是创建Matrix类。您可以定义T& Matrix::operator()(int,int)以从矩阵中检索元素,例如myMatrix(1,2)

operator()可以采用的参数数量与任何其他函数相同。这是实现定义的。您的实现应允许的建议最小参数数量为256(在标准的附录B中给出)。


operator()的查找在标准(ISO / IEC 14882:2003§13.3.1.1.2)中定义为:

  

如果函数调用语法中的 primary-expression E求值为类型为“cv T”的类对象,则候选函数集至少包括T的函数调用操作符。 T的函数调用操作符是通过在operator()的上下文中普通查找名称(E).operator()获得的。

翻译:如果使用语法expression()进行函数调用,并且括号前的表达式求值为类的实例,则将对象operator()成员函数添加到候选函数列表中可能被称为。

答案 1 :(得分:3)

如果您为类operator()实施C,那么如果cC类型的对象,您可以编写c()来调用c.operator()() 1}}。您可以根据需要为operator()添加任意数量的参数。

有关operator()何时有用的一个很好的例子,请参见此处:

http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.10

答案 2 :(得分:3)

我没有看到提到的一点是,虽然在语法中它的调用看起来非常类似于常规的非成员(我敢说,C风格)函数。一个区别是,由于functor / function-object是类/结构的实例,因此它可以具有关联状态。

对于非成员函数,这通常意味着静态本地(通常不是保持状态的最佳或最有用的方式)或全局(通常是不合需要的)。函子/函数对象与C ++关于封装的概念很好地结合,而状态/数据与在其上运行的函数紧密相关。

这方面的一个有益的例子是:

//Declaration
struct instructive_example
{
  instructive_example()
: _invocation_count(0) {};

  uint get_invocation_count() const
  { return _invocation_count; }

  void operator()()
  {
    //Do something

    //And/or operate on the state associated with this function object
    //In this case it is a simple increment of _invocation_count
    ++_invocation_count;
  }
private:
  uint _invocation_count;
};

//Instantiation & invocation:
instructive_example eg;

eg();

答案 3 :(得分:1)

与任何重载运算符一样,operator()是一个奇怪的函数名称。它必须是类或结构的成员函数,但除了通用的所有函数规则之外,它的参数没有限制。

x(的类型是类类型时,要评估表达式) args x,C ++将尝试调用x.operator()( < em> args ),其中 args 可以是空字符串或任意数量的函数参数。

答案 4 :(得分:0)

当您将函数调用语法应用于用户定义的类型时,它只是一个正常的函数。

因此它具有常规成员函数的所有限制和功能。它可以是一个模板,可以根据需要选择任意数量的参数,它需要一个返回类型,它可以是const等。