重载函数运算符是否允许创建语法上像C ++中的函数一样的对象?

时间:2019-03-17 04:01:18

标签: c++ function overloading call operator-keyword

我遇到了以下问题:

  

重载函数运算符

     

a。需要一个带有重载运算符的类。

     

b。需要一个带有重载()运算符的类。

     

c。允许您创建在语法上类似于函数的对象。

     d。通常使用带有参数的构造函数。

答案为(a),而据我的理解,正确答案应为(c)。我的逻辑是,运算符()可以在类以及结构中重载。因此,这排除了选项(a)和(b)。而且,当operator()重载时,创建的对象基本上将像函数一样起作用。

例如,如果我们考虑以下因素:

struct A {
      void operator()(char c) { }
};

int main() {
        A a;
        a('z'); // operator() is invoked, hence  works like function
}

请让我知道我在哪里错了。这个问题困扰了我一段时间。谢谢

1 个答案:

答案 0 :(得分:1)

structclass都创建C ++类的类型。这样逻辑就失败了。

像大多数选择题一样,它是垃圾。

“函数运算符”-模棱两可。也许是指“函数调用”运算符。或强制转换为指针的运算符。 http://eel.is/c%2B%2Bdraft/over.call作为猜测。所以我会去的。

  

c。允许您创建在语法上类似于函数的对象。

什么是“赞”?任何对象在语法上都不能与函数名称相同。函数名称在C ++中确实是很奇怪的野兽。任何程度的相似性或差异性都可以证明或反驳这个答案。胡说八道。

  

a。需要一个带有重载运算符的类。

好的,是的;我不知道一种重载函数调用而不重载类上的运算符的方法(或者使用lambda,这对我来说就是做到这一点)。

  

b。需要一个带有重载()运算符的类。

最正确的。换句话说,就是false。

template<auto x>
using k=std::integral_constant<std::decay_t<dexltype(x)>,x>;

然后

void foo(){}

k<foo> not_foo;

not_foo没有重载operator(),但是可以说not_foo()是函数调用的重载。

但是,它确实具有重载的隐式强制转换为函数指针。在执行函数调用时可以选择哪个。

所以b可能是假的。

这个问题使头发分裂而没有精确性。消防教练,请更好的教练。