Что делает void Classname::operator()(){ .... }?

Я пробираюсь через некоторый код C++ и наткнулся на следующее

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

Я предполагаю, что это как-то связано с перегрузкой конструктора, но кто-то может уточнить это?

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"s operator()(int) член для каждого целого числа в списке. Вы можете иметь переменные-члены в instance объект, так что operator()(int) может сделать любую обработку, которую вам требуется. Это более гибко, чем передача необработанной функции, поскольку эти переменные-члены являются неглобальными данными.

Это делает ваш класс объектом, называемым "Functor" ... он часто используется как объект типа замыкания для встраивания состояния в объект, а затем вызывает объект как если бы это была функция, но функция, которая имеет "состояние" без обратной стороны глобально доступных статических переменных, как это было бы у традиционных C-функций, которые пытаются управлять "состоянием" с помощью внутренних статических переменных.

Например, с

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

Экземпляр Classname можно назвать как class_name_instance()и будет вести себя как void функция, которая не принимает аргументов.

Это не перегрузка конструктора - это перегрузка оператора вызова функции. Если вы определили это для класса, вы можете вызвать экземпляр класса, как если бы это была функция. Такой объект обычно называется функтором.

Это код для перегрузки оператора '()', который в основном позволяет использовать класс как функцию без параметров, вы также можете получить что-то вроде:

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

Для получения дополнительной информации о перегрузке вы можете проверить: http://en.wikipedia.org/wiki/Operators_in_C_and_C++

Другие вопросы по тегам