mikrocontroller.net

Forum: PC-Programmierung static in C++ classe


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Rupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.