我是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 ++怎么会有这样的语法?我通过使用搜索引擎搜索相关主题,但没有找到任何结果。
先谢谢。
答案 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或多线程无关。重载操作符只是一个有趣名称的普通函数(这可能有点过于简单,但它对初学者来说是一个很好的经验法则。)
您的班级有一个名为()
的功能。这就是全部。 技术上,您也可以将功能命名为foo
或f
或TwoParentheses
。
考虑一个更简单的例子:
#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程序的特色