operator()重载和c函数对象中的歧义

时间:2016-09-04 08:34:05

标签: c++ function

假设我们有下一个函数对象:

class foo{
private:
    int counter;
public:

    foo(int counter): counter(counter){}
    foo& operator=(const foo& ){...}
    bool operator() (int variable){....}

}

int main(){
    foo f(4);
    foo x(5);
    x = f(4);
    return 0;
 }

编译器如何知道如何响应: x = f(5)? 我已经在网上和Stack中搜索了一段时间,并且没有找到确切的答案,如果是重新发布,请告诉我,我会删除这个问题。

2 个答案:

答案 0 :(得分:4)

这取决于"(5)"用于构造对象或调用已存在的对象:

foo f(5); // calls the constructor
f(5);     // calls operator()

答案 1 :(得分:0)

我添加了一个名为eval的简单方法来解释它:

class foo {
private:
    int counter;

public:

    foo(int counter): counter(counter) {}

    bool operator() (int variable) {
        return variable < counter;
    }

    bool eval(int variable) {
        return variable < counter;
    }
};
  • foo是一个类而非方法。
  • foo的实例可以像方法一样使用。
  • 调用foo(5)会创建一个foo的实例,其中counter = 5

  • evalfoo的成员函数。 (目前这与()运算符相同)

您可以像这样致电eval

foo f = foo(5); // create an instance of `foo`
f.eval(3); // returns true    ->   3 < 5
f.eval(0); // returns false   ->   6 < 5

您还可以使用()运算符:

foo f = foo(5); // create an instance of `foo`
f(3); // returns true    ->   3 < 5
f(0); // returns false   ->   6 < 5

注意:

你也可以写(但不要这样做):

foo f = foo(5); // create an instance of `foo`
f.operator()(3); // returns true    ->   3 < 5
f.operator()(0); // returns false   ->   6 < 5