编译器如何处理仿函数中的重载函数调用操作符?

时间:2013-03-03 03:56:28

标签: c++ function constructor call overloading

假设我定义,实例化并使用这样的加法器仿函数:

class SomeAdder {
    public:
        SomeAdder(int init_x): x(init_x) {}
        void operator()(int num) { cout << x + num <<endl; }
    private:
        int x;
};

SomeAdder a = SomeAdder (3);
a(5); //Prints 8

SomeAdder b(5);
b(5); //Prints 10

构造函数和重载的()运算符都使用双括号调用,并且具有相同类型的参数。在SomeAdder实例化和“函数调用”期间,编译器如何确定使用哪个函数来实现正确的行为?答案似乎表面上看起来很明显,但我无法绕过这个想法。

谢谢你的时间!

3 个答案:

答案 0 :(得分:4)

您的示例会比较构造函数成员函数,它会重载operator()。编译器知道要调用哪一个以及何时调用。这非常简单:

  • 当要构造一个对象时,将调用构造函数。

  • 在已构造的对象上调用成员函数。在您的情况下,成员函数是operator()

这意味着,它们在完全不同的环境中被调用。没有歧义,也没有混淆。

答案 1 :(得分:1)

每次创建类的实例时,都会调用构造函数方法。编译器肯定可以通过其名称确定构造函数。因此,它将首先调用,operator ()将是第二个。

答案 2 :(得分:1)

C ++有grammar,编译器在实例化类型时会知道(粗略简化),因此应该从调用重载运算符()的情况调用构造函数在一个类的实例上。

如何使用语法来确定这可能需要一个关于Dragon Book可能是标准的编译器的课程。如果您很好奇,还可以查看C++ Grandmaster Certification,其目标是构建C ++编译器。