2012-02-28 13 views
5

Eventuali duplicati:
Why is it an error to use an empty set of brackets to call a constructor with no arguments?Istanzia classe con o senza parentesi?

#include <iostream> 
using namespace std; 

class CTest 
{ 
    int x; 

    public: 
    CTest() 
    { 
     x = 3; 
     cout << "A"; 
    } 
}; 

int main() { 
    CTest t1; 
    CTest t2(); 

    return 0; 
} 

CTest t1 stampe "A", naturalmente.

Ma sembra che a t2() non accada nulla, ma il codice funziona bene.

Così usiamo queste parentesi senza argomenti? O perché possiamo usarlo in questo modo?

+0

È [l'analisi più irritante] (http://en.wikipedia.org/wiki/Most_vexing_parse) in C++ –

+0

@PeterWood: Personalmente, lo contesta. Storicamente la "analisi più irritante" si riferisce solo ai casi in cui l'ambiguità si verifica con un inizializzatore che è un valore inizializzato temporaneamente, ad es. 'CTest t2 (CTest());' piuttosto che questo caso più semplice. –

+0

@CharlesBailey "relativo al parsing più irritante" sarebbe stato un modo migliore di metterlo. Grazie. –

risposta

14

Questo è un capriccio della sintassi C++. La linea

CTest t1; 

dichiara una variabile locale di tipo CTest nome t1. Chiama implicitamente il costruttore predefinito. D'altra parte, la linea

CTest t2(); 

è non una dichiarazione di variabile, ma un prototipo locale di una funzione chiamata t2 che non accetta argomenti e restituisce un CTest. La ragione per cui il costruttore non è chiamato per t2 è perché qui non è stato creato alcun oggetto.

Se si desidera dichiarare una variabile locale di tipo di oggetto e utilizzare il costruttore predefinito, è necessario omettere le parentesi.

In C++ 11, in alternativa è possibile dire

CTest t2{}; 

Quale realtà non chiamare il costruttore di default.

Spero che questo aiuti!

+8

Si noti la differenza tra 'CTest t1; CTest t2 = CTest(); ' –

Problemi correlati