# Frage zu static und static const



## Xebov (11. Juli 2005)

Hi

Kann mir jemand erklären was das static macht wenn mans davor setzt?

MFG
Xebov


----------



## Tobias K. (11. Juli 2005)

moin


Z.b. bei der Funktion:

```
void keineahnung()
{
    int wert = 0;
    wert++;
}
```
ist wert am Ende der Funktion immer 1

Bei der Funktion:

```
void keineahnung()
{
    static int wert;
    wert++;
}
```
ist wert das erste mal am Ende der Funktion 1 und wird dann bei jedem Aufruf der Funktion um 1 erhöht.


mfg
umbrasaxum


----------



## RedWing (12. Juli 2005)

Xebov hat gesagt.:
			
		

> Hi
> 
> Kann mir jemand erklären was das static macht wenn mans davor setzt?
> 
> ...



Wenn du das Schlüsselwörtchen static vor eine Variable setzt sagst 
du dem Compiler damit das die Variable zur ganzen Laufzeit über 
existieren soll sprich wenn du eine lokale Variable als static deklarierst
wird sie beim verlassen des Blocks nicht gelöscht sondern bleibt 
im Speicher erhalten...
In Punkto objektorientierung also bei Klassen, bedeutet static im 
Prinzip dasselbe. Will heißen wenn du ein Attribut einer Klasse als 
static deklarierst machst du sie zum Klassenattribut. Der Wert dieser 
Variablen ist somit für alle Objekte gleich und es gibt nur ein 
Exemplar dieser Variable (nicht wie bei einem normalen Attribut pro 
Objekt, sondern einmal für alle Objekte) => eine Klassenvariable 
exisitert unabhängig von der Existenz irgendwelcher Objekte dieser 
Klasse.
//edit
@umbrasaxum
Der Wert muss nicht 1 am Ende des ersten Aufrufs deiner Funktions sein, da du die Variable nicht initialisierst...

Gruß

RedWing


----------



## spiderflo (12. Juli 2005)

Guten Abend vorerst!

Also folgendes ...

_const _Variablen/Datenobjekte sind konstant definiert und dessen Wert kann *durch das Programm nicht* mehr verändert werden.

Welche mit _static _vorran werden nicht mehr auf dem "Stack" unterhalten sondern wie externe Variablen im Datenseqment des Programms selbst.
Das heißt ihre Lebensdauer ist global. Der Geltungsbereich ist aber eingeschränkt.
Wenn man jetzt eine static Variable außerhalb jeder Funktion definiert, ist sie modulglobal und es gibt keine Probleme mit gleichnamigen Variablen aus anderen Quelldatein. Sie kann nur in diesem Modul verwendet werden und ihr Name wird nicht an den "Linker" weitergegeben. Sie ist also _privat_ ...
Das gleiche gilt auch in einem Block (mit {}). Ihr Wert bleibt beim Verlassen des Blocks erhalten und du kannst dann wenn du wieder eintrittst weiterrechnen etc.

Das war jetzt großteils jetzt auf Variablen bezogen.
Also _static const _ist soweit ich das durchblicke *modulglobal* und kann nur von *außerhalb* des Programms verändert werden.
Bitte verbessert mich wenn ich mich irre.

Erkundige dich vielleicht auch mal unter _Speicherklassen_.

Mit freundlichen Grüßen und
noch einer guten Nacht
Florian


----------



## Xebov (12. Juli 2005)

OK ich denke ich habs verstanden. Danke

MFG
Xebov


----------



## jokey2 (12. Juli 2005)

Es gibt noch eine weitere Bedeutung von static:
 Wenn eine Memberfunktion einer Klasse als static deklariert wird, ist sie auch ohne ein entsprechendes Objekt verwendbar. Ein Beispiel ist die MFC-Funktion 
	
	
	



```
static void PASCAL CFile::Remove( LPCTSTR lpszFileName );
```
Damit kann man auch eine Datei löschen, wenn man kein CFile-Objekt davon anlegt.


----------

