理解C ++中的运算符重载

时间:2012-04-11 17:38:09

标签: c++ operator-overloading

我可能有点密集,但无法理解下面的行是什么?

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

background_task f;
std::thread my_thread(f);
  1. 我意识到创建了一个调用类my_thread的对象f的线程(名为background_task),但是什么时候是类{{1}中的函数operator()实际上被称为?

  2. 为什么需要重载函数运算符?

  3. 我理解这是C ++ 101或非常基础,但我仍然无法掌握它,所以我应该参考哪些书籍以便更多地了解C ++的这些主题。

2 个答案:

答案 0 :(得分: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)。

编辑:最初我声称没有涉及超载。这还不完全清楚所以我改写了我的答案。

答案 1 :(得分:1)

  1. 线程对象std::thread(f, a, b, c)复制对象f(让我们称之为copy_of_f),新执行上下文的入口点是调用{{ 1}}(或更详细地说,copy_of_f(a, b, c))。

  2. 对象copy_of_f.operator()(a, b, c)必须是可调用实体,这意味着表达式f必须有意义。

  3. 专门针对C ++ 11的书籍仍处于编写过程中。今年晚些时候,请关注Stroustrup,Meyers和其他人。到那时,互联网可能是你最好的选择。