c ++中的operator()()有什么作用?

时间:2014-10-12 08:59:50

标签: c++ c++11

我是C ++ 11线程的新手,在阅读教程时,我看到了一段代码。

 #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();
}

输出将是“这是新线程”,但我真的不明白函数“operator()()const”是什么意思?在这种情况下,它与构造函数的行为完全相同,是不是?。

C ++怎么会有这样的语法?我通过使用搜索引擎搜索相关主题,但没有找到任何结果。

先谢谢。

4 个答案:

答案 0 :(得分: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,一个合适的 lambda 表达式,一个合适的std::bind调用,简而言之,任何可以不带参数调用的东西。< / p>

答案 1 :(得分: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 ++通用编程中的重要功能的原因,并且通常是必需的。

答案 2 :(得分:2)

它与C ++ 11无关,它是函数调用重载运算符。这意味着如果你有一个类似你的类,你可以创建它的一个实例并用作函数:

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

上面的main函数应该给出与简单线程示例相同的结果。

答案 3 :(得分:0)

是运营商超载。用户为()运算符提供了额外的用途。静态多态性的示例。它是Object orieted程序的特色