Statische Variable in Klassenfunktion

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Statische Variable in Klassenfunktion

Beitrag von Jside » Fr Aug 27, 2010 2:00 pm

Ist eine statische Variable in einer funktion innerhalb einer Klasse nur für diese Instanz, oder für alle Object'e der Klasse statisch?

Code: Alles auswählen

void Foo::Bar() {
static int i = 2;
}

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Statische Variable in Klassenfunktion

Beitrag von fat-lobyte » Fr Aug 27, 2010 4:33 pm

Jside hat geschrieben:Ist eine statische Variable in einer funktion innerhalb einer Klasse nur für diese Instanz, oder für alle Object'e der Klasse statisch?

Code: Alles auswählen

void Foo::Bar() {
static int i = 2;
}
Diese Variable ist für alle Objekte dieser Klasse statisch. Das habe ich mich nämlich auch mal gefragt, denn auf den ersten Blick wäre es so "logisch". Allerdings kannst du mit einer Membervariable eigentlich genau das gewünschte Verhalten erreichen.
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8499
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Statische Variable in Klassenfunktion

Beitrag von Xin » Sa Aug 28, 2010 9:18 pm

Bevor ich hier was falsches behaupte, habe ich mir ein kleines Testprogramm geschrieben, dass mein Verständnis jedoch bestätigt.

Code: Alles auswählen

#include <stdio.h>

class foo
{
  char const* Name;

  public:
    void bar( )
    {
      static int a = 0;
      
      printf( "%s: %d\n", Name, a );
      a++;
    }
    
    foo( char const * name ) : Name(name) {}
};


int main( void )
{
  foo a( "Eins" );
  foo b( "Zwei" );
  
  a.bar();
  b.bar();
  a.bar();
  b.bar();
}[/quote]


Was passiert: Kompilierte Funktionen sind immer (!) statisch, auch wenn es Methoden sind. Ihre "Dynamik" erhalten sie durch die tatsache, dass sie an ein Objekt gebunden sind - hier also foo. Wie sieht das dann in Wirklichkeit aus? Die statische Funktion bar hat einen Parameter, der als Methode versteckt ist.
[code]    void bar( class foo * this )
Wenn man bar nun also als normale, statische betrachtet, die die Objektzugehörigkeit als Parameter verpackt bekommt, erklärt sich auch, wieso die statische Variable immer für alle gilt.
Überschreibt man die Methode, so kann man wiederum mehrere weitere statische Variablen einfügen, um so Datentypabhängig, aber eben für alle Objekte eines Datentyps eine Variable zu haben.

Die Frage finde ich übrigens so gut, dass ich sie mir in die Todoliste schreiben werde für das C++-Tutorial.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Re: Statische Variable in Klassenfunktion

Beitrag von Jside » Mi Sep 01, 2010 4:55 pm

Nebenbei anmerkung: Wenns ne Template Class ist, gilt das für jede Klasse des selben Types:

Code: Alles auswählen

#include <stdio.h>

template<typename T> class foo
{
  char const* Name;

  public:
    void bar( )
    {
      static int a = 0;
     
      printf( "%s: %d\n", Name, a );
      a++;
    }
   
    foo( char const * name ) : Name(name) {}
};


int main( void )
{
  foo<int> a( "Eins" );
  foo<double> b( "Zwei" );
 foo<int> c( "Drei" );

  a.bar();
  b.bar();
c.bar();
  a.bar();
  b.bar();
c.bar();
}
Interessant^^

Antworten