Zmienna statyczna
Zmienna statyczna w programowaniu to zmienna, która ma jedną instancję w danym bloku programu i istnieje przez cały czas jego działania. W języku C++ każda zmienna globalna jest zmienną statyczną.
Zmienna statyczna w bloku funkcji
Zmienna statyczna zadeklarowana w funkcji pamięta swoją wartość pomiędzy wywołaniami funkcji, co odróżnia ją od zmiennych lokalnych. Przykład w C++:
#include
int podajStatyczna() {
static int x = 0; // deklaracja i inicjalizacja zmiennej statycznej
return ++x; // zwiększamy „x” i zwracamy
}
int podajZwykla() {
int x = 0; // deklaracja zmiennej lokalnej
return ++x; // zwiększamy „x” i zwracamy
}
int main() {
std::cout << podajStatyczna() << std::endl; // wyświetli 1
std::cout << podajStatyczna() << std::endl; // wyświetli 2
std::cout << podajZwykla() << std::endl; // wyświetli 1
std::cout << podajZwykla() << std::endl; // wyświetli 1
}
W przykładzie zmienna statyczna `x` jest tworzona i inicjowana tylko raz, co pozwala na zachowanie wartości pomiędzy wywołaniami funkcji. Zmienna zadeklarowana w metodzie klasy działa analogicznie.
Zmienna statyczna w bloku klasy
Zmienna statyczna w klasie jest wspólna dla wszystkich obiektów tej klasy i jest tworzona na początku działania programu. Przykład:
#include
using namespace std;
class MojaKlasa {
public:
static int x;
MojaKlasa() { x++; } // zwiększa „x”
~MojaKlasa() { x–; } // zmniejsza „x”
};
int MojaKlasa::x = 0; // definicja zmiennej statycznej
int main() {
MojaKlasa obiekt1;
cout << obiekt1.x << endl; // wyświetli 1
MojaKlasa obiekt2;
cout << obiekt2.x << endl; // wyświetli 2
cout << MojaKlasa::x << endl; // wyświetli 2
return 0;
}
W tym przykładzie zmienna statyczna `x` działa jako licznik obiektów klasy `MojaKlasa`. Można do niej odwoływać się zarówno przez obiekt, jak i przez nazwę klasy, co jest charakterystyczne dla zmiennych statycznych, które istnieją niezależnie od instancji obiektów.
Właściwości i wykorzystanie
- Zmiennie statyczne mogą zastąpić zmienne globalne, umieszczając je w klasach.
- Tworzenie klas-kontenerów, które uniemożliwiają tworzenie instancji, jest powszechną praktyką.
Przykład klas-kontenerów:
class StaleMatematyczne {
public:
static const double pi;
static const double e;
private:
StaleMatematyczne() {} // konstruktor prywatny
StaleMatematyczne(const StaleMatematyczne& wzorzec) {} // konstruktor kopiujący
StaleMatematyczne& operator=(const StaleMatematyczne& wzorzec) {
return *this; // operator przypisania
}
};
const double StaleMatematyczne::pi = 3.14159;
const double StaleMatematyczne::e = 2.71828;