Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » was macht static?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.06.2005, 18:12 Uhr
Lensflare



Hallo allerseits.

die Frage wurde hier bestimmt schon mehrere male gestellt aber mit der Suchfunktion konnte ich leider nichts Brauchbares finden

also, ich habe absolut keine Ahnung wozu man static braucht.
ich möchte es aber wissen, da das anscheinend oft gebraucht wird und demnach irgend einen nutzen haben muss.

danke schonmal.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.06.2005, 18:59 Uhr
Spacelord
Hoffnungsloser Fall


In Bezug auf Klassen legst du mit static Eigenschaften fest die für die Klasse ansich gelten und nicht für deren konkreten Objekte.Statische Klassenvariablen oder Methoden sind nicht von der Existenz eines Objekts dieser Klasse abhängig.
Das Standardbeispiel ist eine Klassenvariable die benutzt wird um zu zählen wieviele Objekte einer Klasse schon erzeugt wurden.
Da diese eine(!) Klassenvariable für alle Exemplare der Klasse(und je nachdem ob public oder private auch von jedem ausserhalb der Klasse) sichtbar ist inkrementiert man diese dann im Konstruktor wenn ein neues Objekt erzeugt wird und dekrementiert sie im Destruktor wenn ein Objekt der Klasse abgebaut wird.

Funktionslokale statische Variablen werden beim ersten Betreten der Funktion einmalig initialisiert und behalten über die ganze Laufzeit des Programmes hinweg den Wert den sie beim Verlassen der Funktion hatten.Wenn du die Funktion dann erneut aufrufst hat die Variable im Gegesatz zu normalen Autovariablen immer noch diesen Wert und du kannst mit diesem weiterarbeiten.

Dass lässt sich nicht alles in 3 Sätzen schreiben.Such doch mal im Internet danach.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.06.2005, 19:20 Uhr
Lensflare



Danke, das mit den Klassen ist jetzt klar, aber bei den funktionslokalen statischen Variablen hab ich Verständnisprobleme:

wenn die variable in der funktion deklariert und initialisiert wird (initialisierung ist denk ich mal eine definition gleich bei der deklaration), steht doch z.B.
C++:
static int a = 5;
da.
Nach dem verlassen der funktion wird dann also die variable nicht wie gewohnt gelöscht und wenn die funktion ein zweites mal aufgerufen wird, kommt ja wieder
C++:
static int a = 5;
... wird diese zeile dann ignoriert? die variable exestiert ja schon (oder noch)...
kann man den wert der variablen dann wieder ändern, wenn die funktion ein zweites mal ausgeführt wurde?
und wieso nimmt man in diesem Fall nicht eine globale variable bzw eine, die ausserhalb der funktion steht?
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.06.2005, 19:35 Uhr
Spacelord
Hoffnungsloser Fall


1.Korrekt,beim 2. Betreten wird der Code ignoriert.
2.Innerhalb der Funktion kannst du beliebig oft den Wert der Variablen ändern.Aber eben auch nur innerhalb der Funktion.Das ist auch schon der Grund warum man keine globale Variable nimmt.
Globale und statische Variablen sind sich im übrigen recht ähnlich...

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.06.2005, 21:14 Uhr
ao

(Operator)



Zitat von ao:
[quote Spacelord]1.Korrekt,beim 2. Betreten wird der Code ignoriert.

Das würde einen ziemlichen Laufzeit-Overhead mitbringen, bei jedem Betreten der Funktion nachzuschauen, ob wir schon mal da waren, und in Abhängigkeit davon a mit 5 zu belegen oder nicht. Man löst das in der Regel so:

Die Variable a liegt nicht bei den automatischen Variablen auf dem Stack, sondern im globalen Speicherbereich des Programms. Sie wird - genau wie globale Variablen - beim Programmstart initialisiert (hier mit 5) und lebt so lange wie das Programm. Zwischen den Aufrufen der Funktion liegt der letzte Wert also für andere unsichtbar im Speicher.

Wenn aber die Funktion die Adresse der Variablen ermittelt und nach draußen reicht, kann ein Außenstehender über einen Zeiger den Wert abfragen und ändern, womit der Kapselungsmechanismus ausgehebelt wäre.

Aber natürlich würde kein anständiger C-Programmierer solche Schweinereien machen ....

ao[/quote]
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.06.2005, 22:54 Uhr
Spacelord
Hoffnungsloser Fall


@ao:
Das wollte ich damit sagen dass sich statische und globale Variablen recht ähnlich sind.
Wäre jetzt aber nen bisschen viel gewesen gleich damit anzufangen was mit statischen Variablen bereits zur Übersetzungszeit passiert.
Ignoriert wird die Initialisierung natürlich nur wenn man den C++ Code durchläuft.


Zitat von ao:

Wenn aber die Funktion die Adresse der Variablen ermittelt und nach draußen reicht, kann ein Außenstehender über einen Zeiger den Wert abfragen und ändern, womit der Kapselungsmechanismus ausgehebelt wäre.

Aber natürlich würde kein anständiger C-Programmierer solche Schweinereien machen ....



Das würde auch mit privaten Members von Klassen funktionieren.private besagt auch nichts anderes als das der "Name" eines Attributs außerhalb der Klasse nicht ansprechbar ist.
Wenn der Programmierer der Klasse aber ne public Methode schreibt die ne Referenz auf nen private Member zurück gibt kann ich damit außerhalb der Klasse auch machen was ich will.


C++:
class A
{
public:
    A(int i=0):priv(i){};
    int& getPrivRef(){return priv;}
    int getPrivValue(){return priv;}
private:
    int priv;
};

int main ()
{
  A a(34);
  cout<<a.getPrivValue()<<endl;
  int& privInt = a.getPrivRef();
  privInt=55; //das private Attribut ändern
  cout<<a.getPrivValue()<<endl;

  return 0;
}



Sowas macht man halt nicht.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.06.2005, 07:45 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von Lensflare:
Hallo allerseits.

die Frage wurde hier bestimmt schon mehrere male gestellt aber mit der Suchfunktion konnte ich leider nichts Brauchbares finden



Komishc, denn in der FAQ steht als 5. Artikel von oben:Die Bedeutung von static
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.06.2005, 13:44 Uhr
Lensflare



@virtual:

Zitat:
Komishc, denn in der FAQ steht als 5. Artikel von obenie Bedeutung von static

sorry, ich hab die FAQ ganz vergessen
hab nur in den threads gesucht

@ Spacelord & ao:
jetzt hab ich den nutzen von static verstanden, vielen dank für die erklärung
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: