Zmienna statyczna vs globalna

Witam

Pozdrawiam MrGalek

Zakładam że wiesz czym jest programowanie obiektowe ? w OP z reguły tworzysz instancje obiektów, posiadają one zmienne (ściślej pola) instancyjne - czyli takie, które są dostępne wewnątrz obiektu. Zmienne statyczne są dostępne wewnątrz klasy. 

Globalne zmienne są poprostu globalne - dostępne wszędzie, natomiast zmienne statyczne mogę być prywatne dla danej klasy - tzn. nikt spoza tej klasy nie będzie miał do nich dostępu.

Nie do końca.

Globalna zmienna to taka która jest dostępna w całej przestrzeni nazw lub programie. Dla zobrazowania przykład z C++:

int liczba = 33;

void display()
{
    cout << liczba;
}

int main()
{
    cout << liczba; //Wyswietli liczbe 33
    
    display(); //Wyswietli liczbe 33
    
    liczba = 44;
    
    display(); //Wyswietli liczbe 44
    
    return 0;
}

Statyczna może być zarówno własnością obiektu ale i zmienną funkcji. Są one jakby niezależne od instancji obiektu lub funkcji (instancja funkcji - nazwałem to tak dla uproszczenia sformułowanie raczej nie jest poprawne). Chodzi o to że zmienna taka będzie jakby niezależna względem samej funkcji lub obiektu. Będzie np dostępna tylko w przestrzeni nazw klasy lub w zakresie zasięgu funkcji. W przypadku klasy możesz do niej się dostać bez tworzenia obiektu takiej klasy, np przez operator zakresu jeśli zmienna jest publiczna lub przez STATYCZNE publiczne metody klasy. Ważne by były statyczne, jeśli nie będziesz musiał stworzyć obiekt tej klasy by taką metodę wywołać.

Tutaj są 2 przykłady z klasą: http://www.tutorialspoint.com/cplusplus/cpp_static_members.htm

Zmienna (atrybut - klasy mają własności lub atrybuty) ma na celu zliczać ile obiektów tej klasy utworzyliśmy podczas działania programu. W pierwszym przypadku jest ona publiczna i dobieramy się do niej przez operator zakresu (::), w drugim mamy jeszcze metodę statyczną i jeśli zmienilibyśmy widoczność tej zmiennej statycznej na privet to jej wartość sprawdzalibyśmy przy pomocy tej właśnie metody.

Tutaj masz przykład funkcji ze zmienną statyczną:

void liczymy()
{
    static int liczba = 0 // inicjalizacja zmiennych statyczny jest tylko jednorazowa - przy pierwszym wywolaniu funkcji
    
    cout << liczba++;
}

void liczymy2()
{
    int liczba = 0;
    
    cout << liczba++;
}

int main()
{
    liczymy(); // 0
    liczymy(); // 1
    liczymy(); // 2
    liczymy(); // 3
    
    liczmy2(); // 0;
    liczmy2(); // 0;
    liczmy2(); // 0;
    liczmy2(); // 0;
}

 

OP mam całkiem ogarnięte :wink: Co to globalna to wiem, a co do statycznej to zrozumiałem to tak: Jest to zmienna która należy do klasy ale nie ma swojego obiektu. Łopatologicznie: odnosi się do książki kucharskiej, ale nie do konkretnych przepisów. :wink:

No chyba jednak nie. Książka-przepis raczej średnio się ma do klasa-obiekt.

Jeśli już to statyczna odnosi się do wszystkich poszczególnych przepisów, a nie do jednego konkretnego jak to jest ze zwykłymi.

Nie jest tak łatwo podac jakiś życiowy przykład na zmienną statyczną. Używa się tego jako np. jako cache - wszystkie instancje klasy wykonują obliczenia, więc może opłacać się to gdzieś przechować. Wzorce projektowe korzystają z zmiennych statycznych. Możesz w zmiennych statycznych trzymać wartości domyslne, konfigurację dla wszystkich instancji klasy itd.