2014-10-12 110 views
1

我是C++ 11线程的新手,在阅读教程时,会看到一段代码。C++中的operator()()是做什么的?

#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

在C++中搜索“functor” – P0W 2014-10-12 09:01:03

回答

3

这只是运算符重载,并没有任何与C++ 11或支持多线程。重载运算符只是一个有趣名字的正常函数(这可能有点过于简化,但对初学者来说这是一个很好的经验法则)。

您的班级有一个函数名为()。就这样。 技术上,你可能也有一个名为功能foofTwoParentheses

考虑一个简单的例子:

#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 2014-10-13 02:01:03

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 2014-10-13 02:01:46

2

它无关,与C++ 11,它的功能调用超载运营。这意味着,如果你有一个像你这样的类,你可以创建它的一个实例,并作为函数使用:

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

以上main功能应该给予同样的结果作为您简单的线程例子。

0

是操作过载。用户为()运算符提供了额外的用途。静态多态的例子。它是对象的数控车床编程的fearture

+1

这不是面向对象编程的一个特性,至少在C++中通常定义面向对象编程。面向对象的编程意味着运行时多态。 ** OOP =虚拟函数**运算符重载通常对没有任何虚函数的类有意义,反之亦然。 – 2014-10-12 09:08:34