static in C++ classe

Gast #554014
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
Gast #554023
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
Gast #554089
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren