2012-08-31 17 views
5

Ich habe durch andere Fragen hier gelesen und es gibt etwas, das mich verwirrt hat und hoffentlich kann es erklärt werden. Ich bin sicher, dass es eine einfache Sache ist, aber es spielt auf mich an.Unbenannte Namespaces vs private Variablen

So in C++ wir private Variablen, die in der Klasse nur sichtbar sind:

class MyClass 
{ 
    private: 
     int i; 
}; 

Aber wir können auch unbenannte Namensräume:

namespace 
{ 
    int i; 
} 

Sowohl die Klasse als privat erscheinen, aber Im zweiten Fall können Sie nicht sehen, dass sie aus der Header-Datei existieren. Beim Lesen anderer Fragen scheint es, dass Funktionen anders sind, da Sie keine Klassenobjekte an sie übergeben können. Aber ich bin mir nicht sicher, was hier für Variablen der Unterschied ist.

Gibt es einen Nachteil für den zweiten Weg, das heißt, Sie sollten immer noch private Variablen verwenden?

Antwort

13

Sie sind nicht das Gleiche.

Integer i im anonymen Namespace wird von allen Instanzen von MyClass gemeinsam genutzt. Die private Ganzzahl i in MyClass wird für jede Instanziierung der Klasse eindeutig sein.

Die äquivalente private Verwendung wäre i statisch zu machen:

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

Und instanziiert die eine einzige i wie diese geteilt:

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

Das ist ziemlich offensichtlich, jetzt erklären Sie es. Ich wusste, dass sie in einigen Fällen der Statik vorgezogen wurden, aber diese beiden Aussagen waren aus irgendeinem Grund nicht in meinem Kopf zusammen :-) Danke – Firedragon

3

Namespaces haben nichts mit Objekten/Klassen zu tun. Insbesondere wenn Sie zwei Objekte haben, hat jedes seine eigene Kopie einer privaten Variable.

3

Sie sind ganz unterschiedliche Konzepte. Das private Datenelement ist nur für eine Klasse sichtbar und im nicht statischen Fall besitzt jede Klasseninstanz eine dieser Klassen. Mit dem anonymen Namespace können Sie Code nur für anderen Code in derselben Datei verfügbar machen. Im Falle der einzelnen Variablen int würde also der gesamte Code, der an derselben Stelle wie der anonyme Namespace definiert ist, die gleiche einzelne Variable sehen.

5

Beide scheinen auf die Klasse privat zu sein ...

Nein, nur die erste der Klasse privat ist. Es ist eine nicht statische Elementvariable. In jedem Objekt des Klassentyps wird eine instanziiert.

Der zweite ist überhaupt nicht in einer Klasse; es hat eine statische Speicherdauer, also wird eine für das gesamte Programm instanziiert. Alles, was darauf zugreift, greift auf dieselbe Variable zu wie alles andere, das darauf zugreift. In einem unbenannten Namespace ist es nur innerhalb der Übersetzungseinheit (d. H. Der Quelldatei) zugänglich, die es definiert; aber es ist dort für jeden Code zugänglich, nicht nur für eine bestimmte Klasse.

Gibt es einen Nachteil für die zweite Möglichkeit, dass Sie noch private Variablen verwenden sollten?

Wenn Sie eine Kopie der Variablen in jedem Klassenobjekt benötigen, benötigen Sie ein nicht statisches Element.

Wenn Sie es für alle Objekte freigeben möchten, liegt es an Ihnen, ob Sie es zu einem statischen Member machen oder es in einen Namespace innerhalb der Implementierungsdatei der Klasse einfügen. Letzteres mache ich oft, um die Klassendefinition zu vereinfachen. Nachteile sind, dass der Zugriff nicht nur auf die Klasse beschränkt ist, sondern auf alles andere in dieser Datei, und Sie können nicht von jedem Code darauf zugreifen, den Sie in die Kopfzeile einfügen möchten.

Verwandte Themen