假设我定义,实例化并使用这样的加法器仿函数:
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
实例化和“函数调用”期间,编译器如何确定使用哪个函数来实现正确的行为?答案似乎表面上看起来很明显,但我无法绕过这个想法。
谢谢你的时间!
答案 0 :(得分:4)
您的示例会比较构造函数和成员函数,它会重载operator()
。编译器知道要调用哪一个以及何时调用。这非常简单:
当要构造一个对象时,将调用构造函数。
在已构造的对象上调用成员函数。在您的情况下,成员函数是operator()
。
这意味着,它们在完全不同的环境中被调用。没有歧义,也没有混淆。
答案 1 :(得分:1)
每次创建类的实例时,都会调用构造函数方法。编译器肯定可以通过其名称确定构造函数。因此,它将首先调用,operator ()
将是第二个。
答案 2 :(得分:1)
C ++有grammar,编译器在实例化类型时会知道(粗略简化),因此应该从调用重载运算符()
的情况调用构造函数在一个类的实例上。
如何使用语法来确定这可能需要一个关于Dragon Book可能是标准的编译器的课程。如果您很好奇,还可以查看C++ Grandmaster Certification,其目标是构建C ++编译器。