C ++中operator()的含义是什么?我看到它经常用于“仿函数”或比较器等功能对象。但那么这些函数怎么称呼?在其他情况下有用吗?我可以为这样的运算符声明多少个参数?例如,以下是否可以接受?
bool operator() (Foo f, Baz b, Quz q, Oik o) {...}
答案 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
,那么如果c
是C
类型的对象,您可以编写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
等。