C++/Składniki statyczne

Z Wikibooks, biblioteki wolnych podręczników.

< C++
Do zrobienia Do zrobienia:
Pola statyczne muszą być też zadeklarowane poza klasą jako globalne jeśli ciało metod piszemy poza klasą


[edytuj] Wstęp

Czasami zachodzi potrzeba dodania elementu, który jest zwiazany z klasą, ale nie z konkretną instancją tej klasy. Możemy wtedy stworzyć element statyczny. Element statyczny jest właśnie elementem, który jest powiązany z klasą, a nie z obiektem tej klasy, czyli np. statyczna metoda nie może się odwołać do niestatycznej zmiennej lub funkcji.

[edytuj] Składnia

Elementy statyczne poprzedza się podczas definicji słówkiem static. Statyczne mogą być zarówno funkcje, jak i pola należące do klasy.

  class Klasa
  {
       protected:
            static int iloscInstancji; // pole statyczne
       public:
            Klasa() 
            {
                 iloscInstancji++;
            }
            virtual ~Klasa() 
            {
                 iloscInstancji--;
            }
            static int IloscInstancji()
            {
                 return iloscInstancji;
            }
  };

  int Klasa::iloscInstancji=0;

Jak widać do obiektów statycznych z wewnątrz klasy możemy się odwołać tak samo jak do innych pól. Pole IloscInstancji w powyższym przykładzie nie jest jednak zwykłym polem - jest polem statycznym. Oznacza to, że powstanie tylko jedna instancja tego pola. W powyższym przykładzie iloscInstancji ma za zadanie zliczania ile powstało obiektów klasy Klasa.

W powyższym przykładzie ponadto istnieje metoda statyczna. Z takiej metody nie można się odwołać do niestatycznych elementów klasy. Zarówno do klasy statycznej jak do statycznego pola możemy się odwołać nawet jeżeli nie został stworzony żaden obiekt klasy Klasa.

Odwołanie się do metody statycznej IloscInstancji z programu wymaga następująco:

  int i=Klasa::IloscInstancji();

Gdyby zaś pole iloscInstancji było publiczne, a nie chronione, to moglibyśmy się do niego odwołać poprzez:

  int i=Klasa::iloscInstancji;

Ponieważ jednak w powyższym przykładzie pole iloscInstancji jest chronione możemy się do niego odwołać jedynie z klasy Klasa bądź z klas które po niej dziedziczą.

Oczywiscie metody statyczne nie mogą być wirtualne.