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

C++ 理解C+中的运算符重载+;,c++,operator-overloading,C++,Operator Overloading,我可能有点糊涂,但无法理解下面的行是做什么的 class background_task { public: void operator()() const { do_something(); do_something_else(); } }; background_task f; std::thread my_thread(f); 我意识到创建了一个线程(名为my_thread),它调用类background_task的对象f,但是类ba

我可能有点糊涂,但无法理解下面的行是做什么的

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

background_task f;
std::thread my_thread(f);
  • 我意识到创建了一个线程(名为
    my_thread
    ),它调用类
    background_task
    的对象
    f
    ,但是类
    background_task
    中的函数
    operator()

  • 为什么需要重载函数运算符

  • <> Li >

    我理解这是C++ 101或非常基础的,但我仍然不能掌握它,所以我应该参考哪些书来学习更多关于C++的主题。


    operator()()

    这意味着您可以实例化一个后台任务并调用它(本例中没有任何参数)。这使其成为“可调用实体”:

    至于线程,它需要一个不带参数的可调用实体,因此给它传递一个
    background\u任务的实例就可以了。如果
    background\u任务
    不可调用,则无法编译以下内容:

    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)的等效操作

    编辑:最初我声称不涉及重载。这还不完全清楚,所以我重新措辞了我的答案

  • 线程对象
    std::thread(f,a,b,c)
    复制对象
    f
    (我们称之为
    copy\u of f
    ),新执行上下文的入口点是调用
    copy\u of f(a,b,c)
    (或者更详细地说,
    copy\u of f.operator()(a,b,c)

  • 对象
    f
    必须是可调用的实体,这意味着表达式
    f(a,b,c)
    必须有意义

  • 专门介绍C++11的书籍仍在编写过程中。今年晚些时候要注意斯特罗斯特普、迈尔斯和其他人。在那之前,互联网可能是你最好的选择


  • 这不是关于C++的函子。请看这篇文章:你的问题的详细答案;这不是C++ 101。介绍性C++类当然不会覆盖线程,可能不会覆盖自定义函数调用操作符,甚至可能不覆盖编写自己的类。尽管技术上是错误的,但将自定义操作器实现称为“运算符重载”似乎是常见的做法。可悲的是,口语并不总是有意义的。@bitmask现在你让我思考了。也许它毕竟是超载,如果您认为在这种情况下重载操作符空隙(空隙),而不是重载已经为特定类型定义的一些东西……第一个隐式参数(<代码>此< /代码>)总是决定要调用的函数。我不会说
    void X::foo()
    void Y::foo()
    foo
    的重载,尽管它们的名称相同,只是在(逻辑)参数上有所不同。同样的推理也适用于
    void操作符()()const
    。但我在挑剔:)@bitmask我想有人可能会说它是void(X*)和void(X*),也就是说,操作符重载,指向某个对象并返回void。
    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);