Movatterモバイル変換


[0]ホーム

URL:


Przejdź do zawartości
Wikipediawolna encyklopedia
Szukaj

Zmienna statyczna

Z Wikipedii, wolnej encyklopedii

Zmienna statyczna – wprogramowaniu jest tozmienna, która w danym bloku programu posiada dokładnie jedną instancję i istnieje przez cały czas działania programu. W językuC++ każdazmienna globalna jest jednocześnie zmienną statyczną.

Zmienna statyczna w bloku funkcji

[edytuj |edytuj kod]

Zmienna statyczna zadeklarowana w bloku funkcji, zgodnie z definicją pamięta swoją wartość pomiędzy wywołaniami funkcji, co nie jest możliwe przy użyciu zwykłych zmiennych. Przykład wC++:

#include<iostream>intpodajStatyczna(){staticintx=0;// deklaracja, definicja i zainicjowanie zmiennej statycznejreturn++x;// zwiększamy „x” i zwracamy}intpodajZwykla(){intx=0;// deklaracja zwykłej zmiennejreturn++x;// zwiększamy „x” i zwracamy}intmain(){std::cout<<podajStatyczna()<<std::endl;//wyświetli 1std::cout<<podajStatyczna()<<std::endl;//wyświetli 2std::cout<<podajZwykla()<<std::endl;//wyświetli 1std::cout<<podajZwykla()<<std::endl;//wyświetli 1}

Widzimy zadeklarowaną zmienną statyczną w funkcjipodajStatyczna(). Wartość zero jest jej przypisywana tylko raz podczas pierwszego wywołania funkcji. W przeciwieństwie do zwykłej zmiennej, zmienna statyczna nie jest niszczona po wyjściu programu z bloku gdzie została zadeklarowana (w przykładzie wyżej jest to blok funkcji), dzięki temu pamięta swoją wartość pomiędzy wywołaniami funkcji.

Zmienna zadeklarowania w blokumetody w klasie niczym się nie różni od tej zadeklarowanej w bloku funkcji (metoda jest funkcją). Jest wspólna dla wszystkich obiektów klasy, w której zadeklarowana jest dana metoda.

Zmienna statyczna w bloku klasy

[edytuj |edytuj kod]

Zmienna statyczna zadeklarowana w bloku klasy jest jedyną wspólną instancją dla wszystkich obiektów danej klasy. Jest tworzona już na początku działania programu. Przykład wC++:

#include<iostream>usingnamespacestd;classMojaKlasa{public:staticintx;MojaKlasa(){x++;}// konstruktor - zwiększa „x”~MojaKlasa(){x--;}// destruktor - zmniejsza „x”};intMojaKlasa::x=0;// definicja i zainicjowanie zmiennej statycznej „x”intmain(){MojaKlasaobiekt1;cout<<obiekt1.x<<endl;//wyświetli 1MojaKlasaobiekt2;cout<<obiekt2.x<<endl;//wyświetli 2cout<<MojaKlasa::x<<endl;// nie jest błędem: wyświetli 2return0;}

Widzimy zadeklarowaną zmienną statyczną w klasieMojaKlasa. Konstruktor w klasie zwiększa jej wartość, natomiast destruktor zmniejsza. Dzięki temu uzyskaliśmy licznik obiektów klasyMojaKlasa (pominięta została kwestiawspółbieżności). Każda zmienna statyczna w klasie jest jedynie deklarowana. Z powodu tego, że posiada ona jedną instancję w programie, należy podać również jej definicję, którą realizuje się na zewnątrz deklaracji klasy w zakresie globalnym (należy pamiętać, że nie w każdymjęzyku programowania jest to konieczne). W tym miejscu również następuje zainicjowanie zmiennej. W funkcjimain() tworzymy obiekt klasyMojaKlasa. Wyświetlamy aktualną wartość zmiennej statycznej i widzimy wartość 1. Następnie tworzymy drugi obiekt i widzimy, że wartość zmiennej statycznej wynosi już dwa. Zwróćmy uwagę, że za drugim razem odwołujemy się do zmiennej statycznej korzystając z obiektuobiekt2, dzięki temu widzimy, że wszystkie obiekty (w przykładzie są ich 2) współdzielą zmienną statyczną. W kolejnym kroku przedstawiona została technika odwołania się do zmiennej statycznej nie poprzez obiekt, a poprzez nazwę klasy. Jest to spowodowane tym, że zmienne statyczne w klasie istnieją nawet, gdy nie został stworzony żaden obiekt danej klasy. Różnica w C++ polega jedynie na użyciu operatora zakresu::, zamiast. (w innych językach programowania jakJava czyC# do zmiennych statycznych w klasie odwołujemy się poprzez.).

Zmienne statyczne w bloku klasy nazywane są częstopolami statycznymi lubzmiennymi klasowymi.

Właściwości i wykorzystanie

[edytuj |edytuj kod]
  • Zmiennych statycznych używa się jako jedno z rozwiązań uniknięcia używania zmiennych globalnych. Polega ono na zamknięciu zmiennych statycznych we wspólnej klasie. Często deklaruje się takąklasę-kontener, tak aby nie można było stworzyć obiektu tej klasy. Uzyskuje się to poprzez deklarację konstruktorów (co najmniej domyślnego), w sekcji prywatnej klasy (dodatkowo deklaruje się w sekcji prywatnej również konstruktor kopiujący i operator przypisania), np.:
classStaleMatematyczne{public:staticconstdoublepi;staticconstdoublee;private:StaleMatematyczne(){}// pusty domyślny konstruktorStaleMatematyczne(constStaleMatematyczne&wzorzec){}// pusty konstruktor kopiującyStaleMatematyczne&operator=(constStaleMatematyczne&wzorzec){return*this;// pusty operator przypisania}};constdoubleStaleMatematyczne::pi=3.14159;constdoubleStaleMatematyczne::e=2.71828;

Zobacz też

[edytuj |edytuj kod]
Źródło: „https://pl.wikipedia.org/w/index.php?title=Zmienna_statyczna&oldid=70387169
Kategoria:

[8]ページ先頭

©2009-2025 Movatter.jp