Statische Membervariablen und deren Initialisierung
-
Hallo,
ich habe mal eine Frage. Wie der Titel schon sagt geht es um statische Membervariablen und deren Initialisierung.
Aber ein kleiner Codeschnippsel sagt viel mehr als Worte:
class myClass { public: myClass() {} static void initStatic(int a_data) { m_data = a_data; } private: static int m_data; public: static int m_data2; }; int main(int argc, char* argv[]) { myClass::initStatic(5); // oder myClass::m_data2 = 5; return 0; }Also, warum klappt das nicht? Warum muss ich solche Variablen immer im global scope initialisieren? Wie hier:
class myClass { public: static int m_data2; }; int myClass::m_data = 4; int myClass::m_data2 = 5;Warum muss ich dort den Datentyp mit angeben? Dieser ist doch schon bei der Klasse festgelegt.
Wäre super wenn mir das einer erklären könnte. Schonmal vielen Dank...
-
Tobias W schrieb:
Also, warum klappt das nicht? Warum muss ich solche Variablen immer im global scope initialisieren?
Weil du nur bei der Definition initialisieren kannst.
Tobias W schrieb:
Warum muss ich dort den Datentyp mit angeben?
Weil das die Definition der Variablen ist. Das in der Klassendefinition ist nur eine Deklaration.
-
Tobias W schrieb:
Also, warum klappt das nicht? Warum muss ich solche Variablen immer im global scope initialisieren? Wie hier:
Du mußt sie nicht im global scope initialisieren (wenn du dort nichts angibst, werden sie mit 0 vorbelegt), aber du mußt sie im global scope definieren.
(deine "InitStatic()" bzw. die Zuweisung sind übrigens keine Initialisierungen)
-
Danke, ich habe (mal wieder) Deklaration, Definition und Initialisierung durcheinander gebracht.
Trotzdem stellt sich mir noch die Frage, warum ein "int a;" im Prinzip Deklaration & Definition in einem, aber "static int a;" nur die Deklaration ist?!
-
das "int a;" ist prinzipiell auch nur eine Deklaration - allerdings werden nicht-statische Member auch mit definiert, wenn du ein Objekt anlegst. Statische Member leben außerhalb der Objekte und müssen deshalb gesondert definiert werden.
-
Achso, das heißt technisch gesehen sind statische Membervariablen einfach globale Variablen mit Klassenscope.
Ich habe bis jetzt immer gedacht das die statischen Membervariablen im Codesegment des Programms liegen, stimmt das dann überhaupt?
-
Tobias W schrieb:
Achso, das heißt technisch gesehen sind statische Membervariablen einfach globale Variablen mit Klassenscope.
Ja, so kannst du das sehen
Ich habe bis jetzt immer gedacht das die statischen Membervariablen im Codesegment des Programms liegen, stimmt das dann überhaupt?
Müsste stimmen (wobei ich mir nicht sicher bin, wie die Speicherbereiche jenseits von Heap und Stack genau heißen). Aber globale Variablen liegen auch im Code-Segment.
-
Super, danke, der Nebel hat sich somit wieder ein Stück gelegt...