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

understanding operator overload in C++

本文关键字:运算符 重载 C++ 了解      更新时间:2023-10-16

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

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. 为什么需要重载函数运算符?

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

这个

定义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. 线程对象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和其他人。在那之前,互联网可能是你最好的选择。