Что делает 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++