Hallo, Die übliche Vorgehensweise in C++ ist ja diese // header datei class X { public: static int x; }; // genau eine cpp datei int X::x = 0; was ist aber wenn ich class X { public: static int get_x() { static int x = 0; return x; } }; dann muss ich doch nicht eine Definition (Speicherzelle) für x angeben? wo letztendlich Speicher für x angelegt wird, ist die Sache des Compilers und des Linkes, sehe ich das richtig? Grüsse, Daniel
Hallo! Dein x im zweiten Fall ist doch eh in der Funktion deklariert, das passt schon so. Wo genau der Compiler den Platz für x (im zweiten Fall) vorsieht, liegt in der Freiheit des Compilers. Der Speicher wird - meines Wissens nach - überhaupt erst beim ersten Aufruf der Funktion get_x angefordert, ist also ähnlich wie "lazy evaluation", immerhin könnte der Wert von x bei der Initialisierung von weiteren Laufzeitvariablen abhängen. Lg, Karli
> dann muss ich doch nicht eine Definition (Speicherzelle) für x angeben? Doch, aber das hast du schon getan. > wo letztendlich Speicher für x angelegt wird, ist die Sache des > Compilers und des Linkes, sehe ich das richtig? Ja. In der Regel dürfte es ähnlich einer globalen Variable sein. > Der Speicher wird - meines Wissens nach - überhaupt erst beim ersten > Aufruf der Funktion get_x angefordert, ist also ähnlich wie "lazy > evaluation", immerhin könnte der Wert von x bei der Initialisierung von > weiteren Laufzeitvariablen abhängen. Kommt drauf an. Laut C++-Norm wird die Variable beim ersten Aufruf erzeugt. Das sagt allerdings erstmal nichts darüber aus, wann der Speicher reserviert wird. Außerdem gilt in C++ immer die as-if-Regel, die besagt, daß nicht unbedingt das passieren muß, was in der C++-Norm steht. Der Effekt muß nur derselbe sein. Bei einem simplen Typ wie int bemerkt man keinen Unerschied. Bei Klassen mit Konstruktor sieht das anders aus.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.