2013-03-03 7 views
5

Say I definieren, instanziiert und einen Addierer Funktors wie so verwenden:Wie behandelt der Compiler überladene Funktionsaufrufoperatoren in Funktoren?

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 

Der Konstruktor und die überladene () Bediener beide Doppel Klammern genannt verwendet und haben die gleichen Arten von Parametern. Wie würde der Compiler bestimmen, welche Funktion bei den Instanziierungen von SomeAdder und den "Funktionsaufrufen" verwendet werden soll, um das korrekte Verhalten zu implementieren? Die Antwort scheint oberflächlich klar zu sein, aber ich kann diesen Gedanken nicht umschließen.

Danke für Ihre Zeit!

+2

Auf die gleiche Weise unterscheidet es 'f (x)' von 'g (x)' wobei 'void f (int); void g (int) ';-) – delnan

+1

Wenn der Compiler' SomeAdder (...) 'sieht, wie könnte er dann denken, dass es sich um einen' operator() 'handelt, wenn' SomeAdder' ein Typ ist? – mfontanini

+0

Um ehrlich zu sein, erinnere ich mich daran, dass ich auch anfangs verwirrt war. –

Antwort

4

Ihr Beispiel vergleicht Konstruktor und Memberfunktion die operator() Überlastung. Der Compiler weiß, welcher angerufen werden soll und wann. Es ist ziemlich einfach:

  • Wenn ein Objekt erstellt werden soll, wird der Konstruktor aufgerufen.

  • Die Elementfunktion wird für ein bereits erstelltes Objekt aufgerufen. In Ihrem Fall lautet die Elementfunktion operator().

Das heißt, sie werden in ganz anderen Kontexten aufgerufen. Es gibt keine Zweideutigkeit, keine Verwirrung.

1

Jedes Mal, wenn eine Instanz einer Klasse erstellt wird, wird die Konstruktormethode aufgerufen. Der Compiler kann den Konstruktor sicher anhand seines Namens bestimmen. So wird es zuerst genannt und operator() wird Sekunde sein.

1

C++ hat eine grammar und davon wird der Compiler wissen (grobe Vereinfachung), wenn ein Typ instanziiert wird und daher ein Konstruktor von dem Fall aufgerufen werden sollte, in dem ein überladener Operator () für eine Instanz einer Klasse aufgerufen wird.

Wie die Grammatik verwendet wird, um dies zu bestimmen, erfordert wahrscheinlich einen Kurs auf Compiler, der Dragon Book ist wahrscheinlich der Standard. Wenn Sie neugierig sind, können Sie auch die C++ Grandmaster Certification auschecken, deren Ziel es ist, einen C++ - Compiler zu erstellen.