2013-03-03 19 views
5

Say definisco, un'istanza, e utilizzare un funtore sommatore modo:In che modo il compilatore gestisce gli operatori di chiamata di funzione sovraccarichi nei funtori?

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 

Il costruttore ed il sovraccarico () operatore sono entrambi chiamati con doppia parentesi e gli stessi tipi di parametri. In che modo il compilatore determina quale funzione utilizzare durante le istanze di SomeAdder e le "chiamate di funzione", in modo da implementare il comportamento corretto? Sembra che la risposta sia ovvia in superficie, ma non riesco a capirlo.

Grazie per il vostro tempo!

+2

Nello stesso modo in cui distingue 'f (x)' da 'g (x)' dove 'void f (int); void g (int) ';-) – delnan

+1

Se il compilatore vede' SomeAdder (...) ', allora come potrebbe pensare che sia una chiamata a un' operator() 'se' SomeAdder' è un tipo? – mfontanini

+0

A dire il vero mi ricordo di essere stato confuso anche da questo, inizialmente, molto tempo fa. –

risposta

4

Il vostro esempio confronta costruttore e funzione membro che sovraccarica operator(). Il compilatore sa quale chiamare e quando. È piuttosto semplice:

  • Quando un oggetto deve essere costruito, viene chiamato il costruttore.

  • La funzione membro viene invocata su un oggetto già creato. Nel tuo caso, la funzione membro è operator().

Ciò significa che vengono richiamati in contesti completamente diversi. Non c'è ambiguità, nessuna confusione.

1

Ogni volta che viene creata un'istanza di una classe viene chiamato il metodo del costruttore. Il compilatore di sicuro può determinare il costruttore con il suo nome. Quindi verrà chiamato prima e operator() sarà il secondo.

1

Il C++ ha un grammar e da quello il compilatore saprà (semplificazione grossolana) quando un tipo viene istanziato e quindi un costruttore dovrebbe essere chiamato dal caso in cui un operatore sovraccarico () viene chiamato su un'istanza di una classe.

Come la grammatica viene utilizzata per determinare questo probabilmente richiede un corso sui compilatori che lo Dragon Book è probabilmente lo standard. Se sei curioso puoi anche dare un'occhiata allo C++ Grandmaster Certification il cui obiettivo è costruire un compilatore C++.

Problemi correlati