5

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

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,以实现正确的行为?答案似乎在表面上很明显,但我就是无法理解这个想法。

谢谢你的时间!

4

3 回答 3

4

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

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

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

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

于 2013-03-03T04:14:55.890 回答
1

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

于 2013-03-03T04:14:12.057 回答
1

C++ 有一个语法,编译器将知道(大体简化)何时实例化类型,因此应该从在()类的实例上调用重载运算符的情况下调用构造函数。

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

于 2013-03-03T04:24:19.340 回答