2016-07-22 8 views
5

Wenn ich eine Klasse wieWie wird ein statisches Member in einer Klasse zugeordnet?

class MyClass { 
    public: 
     int myMember1; 
     int myMember2; 
     int myMember3; 
}; 

Jedes Mal, wenn ich ein Objekt von MyClass Raum instanziiert für drei aufeinanderfolgende int zugeordnet ist, was ist, wenn ich so etwas wie

class MyClass { 
    public: 
     static int myMember1; 
     int myMember2; 
     int myMember3; 
}; 

Wie der Speicher zugeordnet ist diesmal?

Ich frage, weil ich nicht ganz sicher bin, wie der Speicher zugeordnet werden würde, wenn ich mehrere Instanzen der gleichen Klasse deklariere, gibt es vielleicht einen Zeiger auf das statische Element?

Antwort

4

Wie bereits erwähnt, müssen Sie explizit Speicherplatz für die statische Membervariable außerhalb der Klassendefinition zuweisen.

Als Antwort auf Ihre andere Frage sind statische Membervariablen nicht mit Klassenobjekten verknüpft. Das heißt, sie werden auch dann bestehen bleiben, nachdem Ihr MyClass-Objekt nicht mehr existiert (bis zur Beendigung Ihres Programms) und für alle Instanzen Ihrer Klasse freigegeben werden.

Sagen Sie mehrere Instanzen der MyClass Klasse wie so erstellt:

class MyClass { 
public: 
    static int myMember1; 
    int myMember2; 
    int myMember3; 
}; 

int MyClass::myMember1 = 1; 

int main() 
{ 
    MyClass mc1; 
    MyClass mc2; 

    mc2.myMember1 = 2; 

    std::cout << mc1.myMember1 << '\n'; 
    std::cout << mc2.myMember1 << '\n'; 
    return 0; 
} 

Der Ausgang wird sein:

2 
2 
+2

Es ist wahrscheinlich darauf hingewiesen werden, dass, obwohl 'mc1.myMember1' legal ist, ist es schlechter Stil. Normalerweise möchten Sie 'MyClass :: myMember1' schreiben, um zu verdeutlichen, dass der Wert keiner bestimmten Instanz zugeordnet ist. –

1

Statische membes werden in statischen Speichern zugewiesen

Sie in diesen Mitgliedern als globale Variablen denken können, aber innerhalb des Klassenbereiches (mit entsprechendem Zugang, in Ihrem Fall, öffentlich) erklärt.

3

Wie der Speicher dieses Mal [mit dem statischen Mitglied] zugewiesen wird?

Jede Instanz des Objekts 2 ganze Zahlen in haben und alle Instanzen haben Zugriff auf den static integer (aber nicht „eigene“ it) - es ist nicht Teil der Fälle ist, ist es im Rahmen der Klasse.

N.B. Das Mitglied wird in der Klasse deklariert, muss jedoch außerhalb der Klasse (in der cpp-Datei) definiert werden, z. vielleicht

int MyClass::myMember1 = 42; 

... ist es ein Zeiger auf das statische Mitglied?

Nein. Sie können einen Zeiger das statische Mitglied abrufen, wenn Sie möchten, aber nicht jeder Instanz zugewiesen ist.

Das statische Element wird beim Start der Anwendung zugewiesen (und entsprechend der Initialisierung in der cpp-Datei initialisiert) und kann wie andere "globale" Objekte aufgerufen werden (obwohl sich das Statische nicht im globalen Namespace befindet) nur eine Instanz davon). Die Zugänglichkeit des Elements (d. H. public, private gegenüber protected) folgt den normalen Regeln.


Um den Effekt auf die Größe zu sehen, können Sie sizeof();

class MyClass { 
    public: 
     int myMember1; 
     int myMember2; 
     int myMember3; 
}; 

class MyClass1 { 
    public: 
     static int myMember1; 
     int myMember2; 
     int myMember3; 
}; 

int MyClass1::myMember1 = 42; 

int main(int argc, char* argv[]) 
{ 
    using namespace std; 
    cout << sizeof(MyClass) << " " << sizeof(MyClass1) << endl; 
} 

vorstehend (je nach Ausrichtung und der Größe der int), konnte eine Leistung von 12 8 erzeugen.

Demo

2

Sie haben auch die Variable außerhalb der Klasse zu definieren. Dort wird die eigentliche Zuteilung vorgenommen.

Im Wesentlichen ist es das gleiche wie eine globale Variable.

class Test 
{ 
    public: 

    static int too; // Just a declaration 
}; 

int Test::too; // Actual allocation, every instance will use this 
2

Sie müssen Speicher für dieses statische Mitglied irgendwo explizit zuweisen.

Zum Beispiel Ihrer Klasse in in seinem Header-Datei:

// myclass.h 
class MyClass { 
    public: 
     static int myMember1; 
     int myMember2; 
     int myMember3; 
}; 

Und Sie haben eine CPP-Datei für diese Klasse, die explizit Raum für das statische Element zuordnet, kann es auch initialisieren:

// myclass.cpp 
int MyClass::myMember1 = 5; 

So wird Ihr statisches Mitglied an genau einer Stelle in Ihrem Programm in der Übersetzungseinheit Ihrer Wahl zugewiesen. Sie können diese Zuordnung in jede gewünschte Datei einfügen, solange sie nur Teil einer Übersetzungseinheit ist.

Verwandte Themen