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()
我理解这是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);