2010-02-22 3 views
9

Voglio costruire un oggetto nello stack, usando C++. Sai qual è la differenza tra questi per modi di chiamare il costruttore (con e senza parentesi):Diversi modi di costruire un oggetto in C++

una) MyClass object ;

b) MyClass object() ;

Sto usando MFC e nella costruzione la variabile globale per l'app principale, se uso quest'ultimo modo, ottengo un'eccezione, ho pensato che questi due modi fossero equivalenti.

Grazie ragazzi per qualsiasi informazione.

+0

come fa il costruttore di MyClass assomiglia? –

+0

Non penserei che otterresti un'eccezione con (b). Ciò dovrebbe comportare un errore di compilazione. – LeopardSkinPillBoxHat

risposta

18

Questo è uno di quei trucchi del C++.

MyClass object(); 

è il modo che una funzione prototipo è definito in C++, in modo che il compilatore pensa che si sta tentando di dichiarare un'altra funzione nel bel mezzo di un'altra funzione.

Se si vuole invocare il costruttore di default (cioè quella che non prende argomenti), utilizzare questa sintassi invece:

MyClass object; 

Vedi anche la risposta di Garth Gilmour alla domanda ormai cancellato What is your (least) favorite syntax gotcha?:

In C++

Employee e1("Dave","IT"); //OK 
Employee e2("Jane"); //OK 
Employee e3(); //ERROR - function prototype 
+2

L'inizializzatore '()' in C++ non è necessariamente un'invocazione del costruttore predefinito. L'inizializzatore '()' esegue l'inizializzazione del valore che non è equivalente alla chiamata del costruttore di default, cioè l'ultima forma (senza '()') non è equivalente all'intenzione espressa nella prima. Il modo corretto per risolvere il problema del "prototipo" è utilizzare la sintassi di inizializzazione della copia 'MyClass object = MyClass()' e sperare che il compilatore lo traduca in codice efficiente. – AnT

+0

@David: hai ragione e sto cancellando il mio commento –

8

Per esempio:

class MyClass 
{ 
    public: 
    MyClass() 
    {x = 0;} 
    MyClass(int X) 
    {x = X;} 
    private: 
    int x; 
}; 

int main() 
{ 
    MyClass myObject(56); // initialize x to value '56' 
    MyClass myObject2; //calls default constructor and initializes x to 0 
    return 0; 
}