2012-08-31 18 views
5

Ho letto altre domande qui e c'è qualcosa che mi ha confuso e spero che possa essere spiegato. Sono sicuro che è una cosa semplice ma mi sta alludendo.Spazi dei nomi senza nome vs variabili private

Quindi, in C++ abbiamo variabili private che sono visualizzabili solo all'interno della classe:

class MyClass 
{ 
    private: 
     int i; 
}; 

ma possiamo anche avere spazi dei nomi senza nome:

namespace 
{ 
    int i; 
} 

Entrambe sembrano essere privato della categoria, ma nel 2 ° caso non è possibile vedere che esistono dal file di intestazione. Dalla lettura di altre domande sembra che le funzioni siano diverse in quanto non è possibile passare loro degli oggetti di classe? Ma non sono sicuro di quale sia la differenza per le variabili.

C'è uno svantaggio del 2o modo che significa che si devono ancora utilizzare variabili private?

risposta

13

Non sono la stessa cosa.

Il numero intero i nello spazio dei nomi anonimo sarà condiviso da tutte le istanze di MyClass.

Il numero intero privato i in MyClass sarà univoco per ogni istanza della classe.

L'equivalente utilizzando private sarebbe quello di fare i statica:

//.h 
class MyClass 
{ 
    private: 
     static int i; 
}; 

E istanziare un singolo condiviso i come questo:

//.cpp 
int MyClass::i = 0; 
+0

Questo è abbastanza ovvio ora lo spieghi. Sapevo che in alcuni casi erano preferibili alla statica, ma quelle 2 affermazioni non si sono legate nella mia testa per qualche motivo :-) Grazie – Firedragon

3

Gli spazi dei nomi non sono correlati ad oggetti/classi. In particolare, se hai due oggetti, ognuno ha la propria copia di una variabile privata.

3

Essi sono molto diversi concetti. Il membro di dati privato è visibile solo a una classe e, nel caso non statico, ogni istanza di classe ne possiede uno. Lo spazio dei nomi anonimo consente di rendere il codice disponibile solo per altri codici nello stesso file. Quindi, nel caso della singola variabile int, tutto il codice definito nello stesso posto dello spazio dei nomi anonimo vedrebbe la stessa variabile singola.

5

Entrambi sembrano essere privata alla classe ...

No, solo il primo è riservato alla classe. È una variabile membro non statica; uno è istanziato in ogni oggetto del tipo di classe.

Il secondo non è affatto in una classe; ha una durata di archiviazione statica, quindi viene istanziata per l'intero programma. Qualunque cosa acceda è accedendo alla stessa variabile di qualsiasi altra cosa che vi accede. Essendo in uno spazio dei nomi senza nome, è accessibile solo all'interno dell'unità di traduzione (cioè il file sorgente) che lo definisce; ma è accessibile a qualsiasi codice lì, non solo a una particolare classe.

C'è uno svantaggio del 2o modo che significa che si devono ancora utilizzare variabili private?

Se si desidera una copia della variabile in ogni oggetto classe, è necessario che sia un membro non statico.

Se si desidera condividerlo tra tutti gli oggetti, quindi spetta a te decidere se trasformarlo in un membro statico o inserirlo in uno spazio dei nomi all'interno del file di implementazione della classe. Faccio spesso il secondo a semplificare la definizione della classe. Gli svantaggi sono che l'accesso non è limitato solo alla classe ma a qualsiasi altra cosa in quel file e non è possibile accedervi da qualsiasi codice che si desideri inserire nell'intestazione.