2010-10-24 24 views
7

Supponiamo che ho una classecostruttore con un parametro predefinito

class C { 
     C(int a=10); 
}; 

perché se chiamo

C c; 

il contructor C(int =10) si chiama e se chiamo

C c(); 

il costruttore di default è chiamato? Come evitare questo? Voglio eseguire solo il mio costruttore, ho cercato di rendere privato il costruttore predefinito, ma non funziona.

+3

Che ne dici se ci fornisci una porzione di codice compilabile che ci mostra il comportamento che ritieni di vedere? Come puoi vedere dalle risposte finora, ciò che descrivi non è ciò che il codice dovrebbe fare. – sbi

+0

Proprio come una FYI, MSVC (almeno dal VS2003) fornirà un avvertimento su questo problema: 'avviso C4930: 'C c (void)': funzione prototipo non chiamata (era prevista una definizione di variabile?)' Conosco altri compilatori anche così, ma quelli che ho prontamente disponibili al momento no. –

risposta

17
  1. realtà, C c(); dovrebbe essere analizzato come una dichiarazione di funzione . Per richiamare esplicitamente il costruttore predefinito, è necessario scrivere C c = C();.
  2. Una volta definito qualsiasi costruttore, il compilatore sarà non fornire un costruttore predefinito per il proprio tipo, in modo che nessuno possa essere chiamato.
  3. Poiché il costruttore può essere richiamato con un argomento, funge da funzione di conversione implicita. Dovresti considerare di renderlo explicit, per evitare che le conversioni implicite si avviino in momenti imprevisti.
+0

@ Greg: Grazie, non sono sicuro di come sono riuscito a farlo! ':' – sbi

14

Il codice C c(); non fa quello che pensi lo fa:

dichiara una funzione chiamata c che non accetta argomenti e restituisce un C. È equivalente a

C c(void); 
+0

La cosa importante è che non fa nulla (in termini di comportamento di runtime). –

1

Questo perché il c() viene interpretato come una funzione denominata c. C() attiverà la funzione di costruzione appropriata per la classe C

Problemi correlati