在C ++中,operator()的含义是什么?我看到它经常用于“函数对象”或函数比较器等功能。那么这样的函数如何调用?在其他情况下有用吗?对于这样的运算符,我可以声明多少个参数?例如,以下是可以接受的吗?
bool operator() (Foo f, Baz b, Quz q, Oik o) {...}
bool operator() (Foo f, Baz b, Quz q, Oik o) {...}
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()
的另一个常见用途是创建矩阵类时使用。您可以定义T& Matrix::operator()(int,int)
以从矩阵中检索元素,例如myMatrix(1,2)
。
operator()
可接受的参数数量与其他函数相同。不过这是由具体实现决定的。标准建议您的实现应至少允许256个参数(在附录B中给出)。
operator()
的查找在标准中有定义(ISO/IEC 14882:2003 §13.3.1.1.2),如下所示:E
在求值时得到了类型为"cv T
"的类对象,则候选函数集合包括T
的函数调用运算符。T
的函数调用运算符是通过在上下文(E).operator()
中对名称operator()
进行普通查找而获得的。expression()
语法进行函数调用,并且括号前的表达式求值结果是一个类的实例,则会将该类的operator()
成员函数添加到可能被调用的候选函数列表中。我没有看到提到的一点是,尽管在语法上,它的调用方式与常规的非成员函数(我敢说是C风格的)非常相似。一个区别是,由于函数对象是类/结构的实例,它可以有一个关联状态。
对于非成员函数,这通常意味着静态局部变量(经常不是维护状态的最佳或最有用的方法)或全局变量(通常不希望)。而函数对象与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();
http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.10
像任何重载运算符一样,operator()
是一个函数的奇怪名称。它必须是类或结构体的成员函数,但除了所有函数的通常规则之外,对其参数没有限制。
当x
的类型为类类型时,为了评估表达式x(
args)
,C++将尝试调用x.operator()(
args)
,其中args可以是空字符串或任意数量的函数参数。
这只是一个普通的函数,当您将函数调用语法应用于用户定义的类型时,它会被调用。
因此,它具有常规成员函数的所有限制和特性。它可以是模板,可以接受任意数量的参数,需要返回类型,可以是const
等。