【问题标题】:Why overload the () operator (callable operator) in a C++ class or struct when you could use a constructor? [duplicate]当您可以使用构造函数时,为什么要在 C++ 类或结构中重载 () 运算符(可调用运算符)? [复制]
【发布时间】:2019-06-02 23:02:24
【问题描述】:

为什么要在 C++ 类或 C++11 或更高版本的结构中重载 () 运算符?据我所知,当您想要将类或结构等对象传递到 std::thread 并通过可调用类型启动一个带有数据包的新线程时,这些运算符会被重载。 但除此之外,为什么还要重载 () 运算符?你不能简单地在类或结构的构造函数中做同样的事情吗?

为什么要使用

  struct MyCallableStruct{
    void operator() () {
        dosomething();
    }
  }

什么时候可以做

  struct MyCallableStruct{
      MyCallableStruct() { dosomething(); }
  }

【问题讨论】:

  • 它们的效果截然不同。
  • operator() 的全部意义在于让对象看起来像函数一样。是的,如果你忽略一个特征的点,那么这个特征就没有意义。但是,如果您不从可以忽略功能的预期点的角度出发,那么……嗯,这就是重点。我不明白你的问题。
  • 这两个上下文完全不同。前者实际上并不执行anything;它只声明了一个 can 的操作符。后者总是在构造时执行。如果这符合您的使用模式,那就这样吧,但它们是非常不同的东西。
  • 一个是对象可以用作函子,另一个是在对象构造时发生。可以一遍又一遍地调用具有函子的构造对象。构造对象只构造一次。

标签: c++ c++11 operator-overloading callable-object


【解决方案1】:

它们完全不同。

首先也是最重要的,当您使用 operator() 时,它可以作为函数参数传递(通过对象)。 相比之下,当由构造函数实现时,只能通过模板传递(按类)

其次,operator() 可以在对象创建后多次调用, 而construtor只能在构造时调用

总而言之,它们在不同的场景中是不同的和有用的

【讨论】:

  • 正确,但您可能想澄清“按对象”/“按类”,除非您已经足够了解 C++ 以知道答案,否则您可能会不清楚。
  • 我现在了解用法了。顺便说一句,我现在意识到“按对象”和“按类”的区别
猜你喜欢
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多