2014-10-12 2 views
1

Я новичок в C++ 11, при чтении учебника я вижу такой код.Что делает оператор()() в C++?

#include <thread> 
#include <iostream> 
using namespace std; 

class background_task 
{ 
    public: 
    void operator()() const 
    { 
     cout<<"This is a new thread"; 
    } 
}; 

int main() 
{ 
    background_task f; 
    std::thread my_thread(f); 
    my_thread.join(); 
} 

Выход будет «Это новый поток», но я не»действительно понять, что делает функция„оператор()() Const“значит ?. В этом случае он действует точно так же с конструктором, правильно ?.

И как C++ может иметь такой синтаксис? У меня есть поиск по связанной теме с помощью поисковой системы, но не найдено никакого результата.

Спасибо в продвижении.

+2

Поиск «functor» в C++ – P0W

ответ

3

Это просто перегрузка оператора и не имеет ничего общего с C++ 11 или многопоточным. Перегруженный оператор - это просто нормальная функция с забавным именем (это может быть немного упрощенным, но это хорошее правило для начинающих).

Ваш класс имеет функцию с именем (). Это все. Технически, вы могли бы также назвать функцию foo или f или TwoParentheses.

Рассмотрим простой пример:

#include <iostream> 

class Example 
{ 
public: 
    void operator()() { std::cout << "()"; } 
    void foo() { std::cout << "foo"; } 
    void TwoParentheses() { std::cout << "TwoParentheses"; } 
}; 

int main() 
{ 
    Example e; 
    e.operator()(); 
    e.foo(); 
    e.TwoParentheses(); 
} 

Теперь призывающую перегруженный оператор, как в этом примере в main, изложив всю .operator() часть, довольно бессмысленно, потому что цель перегруженного оператора, чтобы сделать код вызова проще. Вы бы вместо того, чтобы вызвать вашу функцию как это:

int main() 
{ 
    Example e; 
    e(); 
} 

Как вы можете видеть, e(); теперь выглядит точно так, как если бы вы назвали функцию.

Именно поэтому operator() - специальное имя, в конце концов. В шаблоне вы можете обрабатывать объекты с помощью operator() и указателями функций с помощью того же синтаксиса.

Рассмотрим это:

#include <iostream> 

class Example 
{ 
public: 
    void operator()() { std::cout << "Example.operator()\n"; } 
}; 

void function() { std::cout << "Function\n"; } 

template <class Operation> 
void t(Operation o) 
{ 
    o(); // operator() or "real" function 
} 

int main() 
{ 
    Example object; 
    t(object); 
    t(function); 
} 

Это причина, почему operator() является важной функцией в обобщенном программировании C++, и часто требуется.

+0

спасибо, очень полезный комментарий – xtiger

7

void operator()() означает, что экземпляр класса с этим оператором может быть вызван с синтаксисом вызова функции без возвращаемого значения и без каких-либо параметров. Например:

background_task b; 

b(); // prints "This is a new thread" 

operator() часть указывает на то, что является оператором вызова, второй набор пустых скобок () указывают оператор не имеет параметров. Ниже приведен пример с двумя параметрами и возвращаемым значением:

struct add 
{ 
    int operator()(int a, int b) const { return a + b; } 
}; 

add a; 
int c = a(1, 2); // c initialized to 1+2 

Обратите внимание, что этот синтаксис предварительные даты C++ 11. Вы можете создавать вызываемые типы (также называемые функторами) в C++ 03. Связь с C++ 11 заключается в том, что конструктор std::thread ожидает что-то, что можно вызвать без аргументов. Это может быть простой функцией

void foo() {} 

статическая функция член

struct foo { 
    static void bar() {} 
}; 

экземпляр типа, такие как background_task, подходящий лямбда выражение, подходящий вызов std::bind, в общем, ничего который можно назвать без аргументов.

+0

очень полезный комментарий, спасибо :) – xtiger

2

Это не имеет ничего общего с C++ 11, это оператор перегрузки функции вызова. Это означает, что если у вас есть класс, как у вас, вы можете создать его экземпляр и использовать в качестве функции:

int main() 
{ 
    background_task bt; 
    bt(); 
} 

выше main функция должна давать такой же результат, как ваш простой пример потока.

0

Это оператор за погрузкой. пользователь предоставляет дополнительное использование оператору(). Пример статического полиморфизма. это feature of Object orieted program

+1

Это не особенность объектно-ориентированного программирования вообще, по крайней мере, с обычным определением объектно-ориентированного программирования на C++. Объектно-ориентированное программирование означает полиморфизм во время выполнения. ** OOP = виртуальные функции. ** Перегрузка оператора обычно имеет смысл для классов без каких-либо виртуальных функций и наоборот. –

Смежные вопросы