Seite 1 von 1

Statische Variable in Klassenfunktion

Verfasst: Fr Aug 27, 2010 2:00 pm
von Jside
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;
}

Re: Statische Variable in Klassenfunktion

Verfasst: Fr Aug 27, 2010 4:33 pm
von fat-lobyte
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.

Re: Statische Variable in Klassenfunktion

Verfasst: Sa Aug 28, 2010 9:18 pm
von Xin
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.

Re: Statische Variable in Klassenfunktion

Verfasst: Mi Sep 01, 2010 4:55 pm
von Jside
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^^