C++/Składniki statyczne

< C++
(Przekierowano z C++:Składniki statyczne)

Wstęp

edytuj

Czasami zachodzi potrzeba dodania elementu, który jest związany 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.

Składnia

edytuj

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 liczbaInstancji; // pole statyczne
        public:
             Klasa() 
             {
                  liczbaInstancji++;
             }
             virtual ~Klasa() 
             {
                  liczbaInstancji--;
             }
             static int LiczbaInstancji()
             {
                  return liczbaInstancji;
             }
   };
 
   int Klasa::liczbaInstancji = 0;

Jak widać do obiektów statycznych z wewnątrz klasy możemy się odwołać tak samo jak do innych pól. Pole liczbaInstancji 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 liczbaInstancji 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 LiczbaInstancji z programu wymaga następująco:

  int i=Klasa::LiczbaInstancji();

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

  int i=Klasa::liczbaInstancji;

Ponieważ jednak w powyższym przykładzie pole liczbaInstancji 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.