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

How does the compiler handle overloaded function call operators in functors?

本文关键字:函数 重载 调用操作符 编译器 处理函数      更新时间:2023-10-16

假设我定义、实例化和使用一个加法器函子,如下所示:

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的实例化和"函数调用"期间使用哪个函数,以实现正确的行为?从表面上看,答案似乎是显而易见的,但我就是无法理解这个想法。

谢谢你的时间!

你的例子比较了重载operator()构造函数成员函数。编译器知道何时调用哪一个。非常简单:

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

  • 在已经构造的对象上调用成员函数。在您的例子中,成员函数是operator()

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

每次创建一个类的实例时,都会调用构造函数方法。编译器当然可以根据构造函数的名称来确定它。因此,它将首先被调用,operator ()将是第二个

c++有一个语法,编译器将知道(总的简化)何时类型被实例化,因此在类的实例上调用重载操作符()的情况下应该调用构造函数。

如何使用语法来确定这可能需要一门关于编译器的课程,而龙书可能是标准的。如果你很好奇,你也可以看看c++大师认证,它的目标是构建一个c++编译器。