Forum: PC-Programmierung static in C++ classe


von Daniel (Gast)


Lesenswert?

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

von Karl Rupp (Gast)


Lesenswert?

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

von Rolf Magnus (Gast)


Lesenswert?

> 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
Noch kein Account? Hier anmelden.