2013-08-06 16 views
7

Ho una semplice domanda:Il costruttore predefinito di una classe vuota è pubblico. Ma come?

class my 
{ 
}; 
my ob; 

compilatore mi permette di creare un oggetto che ha un senso. E, sono consapevole che non è possibile creare oggetti in cui il costruttore è privato.

A me sembra che tutto all'interno della classe sia private ma ovviamente non il costruttore predefinito (perché mi consente di creare l'oggetto come costruttore predefinito dovrebbe essere public). Ma ciò che mi confonde è che non c'è la sezione public nella classe.

Quindi, crea una sezione public solo per mettere un costruttore predefinito sotto di esso in questo caso?

Oppure c'è qualcos'altro in corso e la mia motivazione non è corretta?

Inoltre, in che modo gli accessi sono pubblici, privati ​​e protetti internamente organizzati/tracciati quando un oggetto viene creato/consultato?

Ho questa domanda perché non ho mai creato un oggetto di una classe vuota fino ad ora.

+1

Il compilatore fornito costruttori, distruttori e operatori di assegnazione sono 'public'. Devi fare attivamente cose per non permetterle. – juanchopanza

risposta

6

Se non si dichiara alcun costruttore, i compilatori C++ genereranno sempre un costruttore pubblico banale. Inoltre, creerà anche implicitamente un costruttore di copia pubblica e un operatore di assegnazione.

Da C++ 11 di serie 12.1.5:

Se non c'è alcun costruttore user-dichiarata per la classe X, un costruttore non avendo parametri è implicitamente dichiarato come default. Un costruttore predefinito implicitamente dichiarato è un membro pubblico in linea della sua classe.

e 12.8.7, 12.8.11:

Se la definizione della classe non dichiara esplicitamente un costruttore di copia, si è dichiarato in modo implicito. [...] Un costruttore di copia implicitamente dichiarato [...] è un membro pubblico in linea della sua classe.

e infine 12.8.18, 12.8.20, 12.8.22:

Se la definizione di classe non dichiara esplicitamente un operatore di assegnazione copia, uno viene dichiarato implicitamente. [...] Se la definizione di una classe X non dichiara esplicitamente un operatore di assegnazione di movimento, uno sarà implicitamente dichiarato [...]. Un operatore di assegnazione copia/spostamento implicitamente dichiarato è un membro pubblico in linea della sua classe.

Si noti che un operatore di assegnazione delle mosse verrà generato solo in determinate circostanze, che vanno oltre lo scopo di questa domanda, vedere 12.8.20 per ulteriori dettagli.

Se si desidera un costruttore privato si deve dichiarare da soli:

class my { my() {} }; 

Se si desidera impedire la generazione di costruttore di copia o di operatore di assegnazione è possibile dichiarare, ma non la loro attuazione:

class my { my(my const &); }; 

Oppure, visto che il C++ 11, eliminare esplicitamente:

class my { my(my const &) = delete; }; 
1

Sì, il compilatore produrrà il costruttore di default e gli operatori di copia di default costruttore e di assegnazione di default come "pubblico" - perché qualsiasi altra cosa renderebbe la classe piuttosto inutile ...

Naturalmente, quei costruttori sarebbe piuttosto semplice - infatti, può essere sostituito con "niente", dal momento che la costruzione di una classe vuota non farà nulla.

1

Il costruttore predefinito generato dal compilatore (e altri operatori) sono automaticamente pubblici. Se si desidera che il costruttore predefinito sia privato, è necessario specificarlo personalmente dichiarandolo all'interno di una sezione privata della classe.

I concetti di privato, protetto e pubblico sono rilevanti solo per il compilatore. Non hanno significato e non sono tracciati in fase di runtime.

1

T egli compilatore genera il costruttore di default come inline public se non è definito dall'utente, la sezione dedicata del C++ draft standard è 12.1/5:

Se non c'è nessun costruttore di user-dichiarata per la classe X, un costruttore che non ha parametri è implicitamente dichiarato come predefinito (8.4). Un costruttore predefinito implicitamente dichiarato è un membro pubblico in linea della sua classe.