2010-09-28 18 views
19

Questo codice non si comporta come mi aspetto.Perché non c'è nessuna chiamata al costruttore?

#include<iostream> 
using namespace std; 

class Class 
{ 
    Class() 
    { 
     cout<<"default constructor called"; 
    } 

    ~Class() 
    { 
     cout<<"destrutor called"; 
    } 
}; 

int main() 
{  
    Class object(); 
} 

mi aspettavo l'uscita 'costruttore predefinito chiamato', ma non ho visto nulla come l'uscita. Qual è il problema?

+3

vostro costruttore è privato. –

+2

@dribeas: questo non è proprio l'analisi più irritante; è solo un riassunto leggermente irritante. L '"analisi più irritante" è di solito riservata per un tentativo di creare una variabile con un inizializzatore diretto di un valore inizializzato temporaneo: "A a (A());" (Il mio errore in origine.) –

+0

vedi anche http://stackoverflow.com/questions/180172/default-constructor-with-empty-brackets –

risposta

17

Nessuna chiamata al costruttore

poiché il costruttore non viene mai chiamato in realtà.

Class object(); viene interpretato come la dichiarazione di una funzione object prendendo alcun argomento e restituisce un oggetto di Class [dal valore]

Prova Class object;

EDIT:

Come Mike notato questo è non esattamente lo stesso codice di ciò che si sta alimentando al compilatore. Il costruttore/distruttore public o è Class una struttura?

Tuttavia google per l'analisi più irritante di C++.

+0

Ottenuto la risposta un momento prima di me _e_ ha riformattato il post. +1 – JoshD

+0

Grazie a @JoshD :) –

31

No. La tua linea Class object(); Ha dichiarato una funzione. Quello che vuoi scrivere è Class object;

Provalo.

Potresti anche essere interessato all'analisi più irritante (come altri hanno notato). Un ottimo esempio è in Effective STL Elemento 6 a pagina 33. (In dodicesima stampa, settembre 2009.) In particolare, l'esempio nella parte superiore della pagina 35 è ciò che hai fatto e spiega perché il parser lo gestisce come una dichiarazione di funzione.

+1

+1, btw Problemi di Visual C++ 'avviso C4930: funzione prototipata non chiamata (era una definizione di variabile intesa?)' In questi casi. – sharptooth

+1

Questa è davvero l'analisi più irritante? Ho sempre pensato che la frase si riferisse al problema più frustrante, che 'T x (T())' è una dichiarazione di funzione. –

+0

@James McNellis: Questo è ciò che Scott Meyers ha chiamato. Non sono esattamente d'accordo, e non ho nemmeno collegato questa domanda immediatamente. Penso che il tuo esempio sia molto più comune e frustrante. – JoshD

0

Si può usare in questo modo:

Class obj; 
//or 
Class *obj = new Class(/*constructor arguments*/); 
Problemi correlati