了解C++中的运算符重载
understanding operator overload in C++
我可能有点密集,但无法理解下面的行是做什么的?
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()()
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) 的操作。
编辑:最初我声称不涉及过载。这并不完全清楚,所以我改写了我的答案。
-
线程对象
std::thread(f, a, b, c)
f
创建对象的副本(我们称之为copy_of_f
),新执行上下文的入口点是调用copy_of_f(a, b, c)
(或更详细地说,copy_of_f.operator()(a, b, c)
)。 -
对象
f
必须是可调用的实体,这意味着表达式f(a, b, c)
必须有意义。 -
专门关于C++11的书籍仍在编写过程中。今年晚些时候,请留意Stroustrup,Meyers和其他人。在那之前,互联网可能是你最好的选择。
相关文章:
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- <T> 通过模板化运算符重载将 std::complex 乘以双倍
- C++20概念:需要运算符重载
- 使用赋值运算符重载从类中返回jobject
- 在运算符重载定义中使用成员函数(const错误)
- 字节到位运算符重载C++
- 为什么在运算符重载时需要参考?
- 类中 c++ 的运算符 + 重载
- 算术复合运算符重载为非成员
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 交换运算符 + 重载会导致无限递归
- 如何理解新的运算符重载?
- 向量保持复数的运算符重载
- 如何创建运算符重载?
- 链接列表运算符重载没有打印出我想要的内容
- C++:需要帮助了解运算符重载错误
- 使用模板化运算符重载 XOR 运算符失败
- 如何确保接受的C++模板类型使运算符重载?
- 运算符重载使用运算符+添加类模板