2012-04-11 390 views
2

我可能有点紧张,但无法理解下面的行是什么?了解C++中的运算符过载

class background_task 
{ 
    public: 
    void operator()() const 
    { 
     do_something(); 
     do_something_else(); 
    } 
}; 

background_task f; 
std::thread my_thread(f); 
  1. 我认识一个线程(名为my_thread)创建它调用对象background_task类的f但当在background_task类功能operator()其实叫什么名字?

  2. 为什么要重载函数操作符?我知道这是C++ 101或非常基本的,但我仍然无法掌握它,所以我应该参考哪些书籍来了解更多关于这些C++主题的内容。

+1

这不是关于[运算符重载](http://stackoverflow.com/q/4421706/1025391),而是关于C++函子。看到这篇文章:http://stackoverflow.com/a/356993/1025391为您的问题的详细答案。 – moooeeeep 2012-04-11 17:44:36

+1

别担心;这不是C++ 101.介绍性的C++类当然不会涵盖线程,可能不会涵盖自定义函数调用操作符,甚至可能不包括编写自己的类。 – 2012-04-11 18:30:13

回答

2

operator()()

class background_task 
{ 
public: 
void operator()() const 
{ 
    do_something(); 
    do_something_else(); 
} 
}; 

这个定义意味着你可以实例化一个background_task并调用它(没有在这种情况下,任何参数)。这使得它成为一个“可调用实体”:

background_task f; 
f(); // calls foo::operator()(), i.e calls do_something() and do_something_else(). 

至于线程,它需要一个可调用实体不带参数,所以传递一个background_task的实例罚款。如果background_task没有赎回以下不会编译:

background_task f; 
std::thread my_thread(f); 

std::thread构造,您还可以通过调用实体的参数,如果有参数,因此,例如

class background_task 
{ 
public: 
void operator()(double x) const 
{ 
    // do something with x, if you want 
    do_something(); 
    do_something_else(); 
} 
}; 

会与

background_task f; 
std::thread my_thread(f, 3.1416); 

在内部,线程将执行相当于调用f(3.1416)。

编辑:本来我声称没有超载涉及。这并不完全清楚,所以我重新回答了我的答案。

+0

好吧,虽然它在技术上是错误的,但将惯例操作符实现称为“操作符重载”似乎是常见做法。可悲的是,口语并不总是有意义的。 – bitmask 2012-04-11 17:51:30

+0

@bitmask现在你让我思考。如果你认为你在这种情况下重载一个运算符void(void),而不是超载已经为特定类型定义的东西,那么它可能是超载了的...... – juanchopanza 2012-04-11 17:55:39

+0

第一个隐含参数('this')总是确定要调用的函数。我不会说'void X :: foo()'和'void Y :: foo()'是'foo'的重载,尽管它们具有相同的名称并且仅在(逻辑)参数中有所不同。 'void operator()()const'也适用于同样的推理。但我很挑剔:) – bitmask 2012-04-11 18:02:18

1
  1. 线程对象std::thread(f, a, b, c)使对象f的副本(我们称之为copy_of_f),以及新的执行上下文的入口点是呼叫copy_of_f(a, b, c)(或更冗长,copy_of_f.operator()(a, b, c))。

  2. 目的f必须是调用实体,这意味着表达f(a, b, c)必须合理。

  3. 专门针对C++ 11的书籍仍在编写过程中。今年晚些时候请留意Stroustrup,Meyers等人。直到那时,互联网可能是你最好的选择。