Что делает void Classname :: operator () () {....}? - PullRequest
3 голосов
/ 06 октября 2011

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

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

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

Ответы [ 4 ]

4 голосов
/ 06 октября 2011

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

3 голосов
/ 06 октября 2011

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

Например, с помощью

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

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

0 голосов
/ 06 октября 2011

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

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

Для получения дополнительной информации о перегрузкеВы можете проверить: Operators_in_C_and_C ++

0 голосов
/ 06 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...