void Classname :: operator()(){....}做什么?

时间:2011-10-06 03:08:05

标签: c++ operator-overloading function-call-operator

我正在研究一些C ++代码并遇到以下内容

void Classname::operator()()
{   
    //other code here
}

我认为这与重载构造函数有关,但有人可以详细说明吗?

4 个答案:

答案 0 :(得分:4)

operator()是函数调用运算符。它允许您像函数一样使用类实例:

Classname instance;
instance(); //Will call the overload of operator() that takes no parameters.

这对于仿函数和各种其他C ++技术非常有用。你基本上可以传递一个“函数对象”。这只是一个重载为operator()的对象。所以你将它传递给一个函数模板,然后函数模板就像一个函数一样调用它。例如,如果定义了Classname::operator()(int)

std::vector<int> someIntegers;
//Fill in list.
Classname instance;
std::for_each(someIntegers.begin(), someIntegers.end(), instance);

这将为列表中的每个整数调用instance的{​​{1}}成员。您可以在operator()(int)对象中包含成员变量,以便instance可以执行您需要的任何处理。这比传递原始函数更灵活,因为这些成员变量是非全局数据。

答案 1 :(得分:3)

它使你的类成为一个名为“Functor”的对象...它经常被用作闭包类型对象,以便在对象中嵌入一个状态,然后调用该对象,如果它是一个函数,但是一个具有“状态”的函数,没有全局可访问静态变量的缺点,就像传统的C函数试图用内部静态变量来管理“状态”一样。

例如,

void Classname::operator()()
{   
    //other code here
}

Classname的实例可以像class_name_instance()一样调用,并且行为类似于不带参数的void函数。

答案 2 :(得分:0)

它没有重载构造函数 - 它正在重载函数调用操作符。如果为类定义它,则可以调用类的实例,就好像它是一个函数一样。这样的对象通常称为仿函数

答案 3 :(得分:0)

这是重载运算符'()'的代码,它基本上允许你将类作为一个没有参数的函数使用,你也可以有类似的东西:

SomeOtherClass Classname::operator ()(Argument1 a, Argument2 b, *[etc]*); and use it like:
Classname instance;
SomeOtherClass someother =  instance(arg1, arg2);

有关重载的更多信息,您可以查看: Operators_in_C_and_C++