Pola i metody statyczne Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 bogdan.kreczmer@pwr.wroc.pl Copyright c 2005 2009 Bogdan Kreczmer Niniejszy dokument zawiera materiały do wykładu na temat programowania obiektowego. Jest on udostępniony pod warunkiem wykorzystania wyłacznie do własnych prywatnych potrzeb i może on być kopiowany wyłacznie w całości, razem z niniejsza strona tytułowa.
Zmienne statyczne #include <stdio.h> void FunkcjaZPamiecia( ) static int IloscWywolan = 0; printf( Wywolanie nr: %i\n,++iloscwywolan); printf( Wartosc poczatkowa: %i\n, FunkcjaZPamiecia( ); FunkcjaZPamiecia( ); FunkcjaZPamiecia( ); return 0; IloscWywolan); Wynik działania programu (po usunięciu pierwszej instrukcji): Wywolanie nr: 1 Wywolanie nr: 2 Wywolanie nr: 3 Zmienne statyczne w języku C pełnia rolę zmiennych globalnych z ograniczonym zakresem dostępu tylko do poziomu funkcji, w której sa deklarowane. Copyright c 2005 2009 Bogdan Kreczmer Pola i metody statyczne 1
class PrzykladKlasy...................................... static int IloscObiektow; PrzykladKlasy( ) ++ IloscObiektow; PrzykladKlasy( ) IloscObiektow; ;........................................................... int PrzykladKlasy :: IloscObiektow = 0; PrzykladKlasy Ob; cout << Ob. IloscObiektow << endl; cout << PrzykladKlasy :: IloscObiektow << endl; Pole statyczne pełni rolę zmiennej globalnej w ramach danej klasy. Istnieje tylko w jednym egzemplarzu niezależnie od wszystkich obiektów. Musi być zadeklarowane oraz zainicjalizowane poza klasa w przestrzeni zmiennych globalnych. Określony zostaje w ten sposób moment jego utworzenia. Copyright c 2005 2009 Bogdan Kreczmer Pola i metody statyczne 2
class PrzykladKlasy //.................................... static int IloscObiektow; PrzykladKlasy( ) ++ IloscObiektow; PrzykladKlasy( ) IloscObiektow; ; //.......................................................... int PrzykladKlasy :: IloscObiektow = 0; cout << PrzykladKlasy :: IloscObiektow << endl; Pole statyczne jest całkowicie niezależne od tego, czy jakieś obiekty klasy, do której ono należy, istnieja czy też nie. Zawsze można do niego odwołać się, o ile jest zezwolenie na dostęp do tegoż pola. Copyright c 2005 2009 Bogdan Kreczmer Pola i metody statyczne 3
class PrzykladKlasy //.................................... static int IloscObiektow; PrzykladKlasy( ) ++ IloscObiektow; PrzykladKlasy( ) IloscObiektow; ; //.......................................................... int PrzykladKlasy :: IloscObiektow = 0; PrzykladKlasy Ob; cout << Ob. IloscObiektow << endl; cout << PrzykladKlasy :: IloscObiektow << endl; Pole statyczne może być zadeklarowane tylko i wyłacznie w przestrzeni zmiennych globalnych. Copyright c 2005 2009 Bogdan Kreczmer Pola i metody statyczne 4
class PrzykladKlasy //.................................... static int IloscObiektow; PrzykladKlasy( ) ++ IloscObiektow; PrzykladKlasy( ) IloscObiektow; ; //.......................................................... PrzykladKlasy ObGlobalny; int PrzykladKlasy :: IloscObiektow = 0; PrzykladKlasy Ob; cout << Ob. IloscObiektow << endl; cout << PrzykladKlasy :: IloscObiektow << endl; Obiekt może być deklarowany przed deklaracja pola statycznego klasy, do której należy ten obiekt. Copyright c 2005 2009 Bogdan Kreczmer Pola i metody statyczne 5
class PrzykladKlasy //...................................................... static int IloscObiektow; PrzykladKlasy( ) ++ IloscObiektow; PrzykladKlasy( ) IloscObiektow; int RozmiarObiektow( ) return IloscObiektow sizeof(przykladklasy); ; //........................................................................... int PrzykladKlasy :: IloscObiektow = 0; PrzykladKlasy Ob; cout << Ob.RozmiarObiektow( ) << endl; Na poziomie metod klasy, w której zdefiniowane sa pola statyczne, do pól tych odwołujemy się w identyczny sposób jak do zwykłych pól klasy. Można też użyć pełnej nazwy kwalifikowanej tego pola. Copyright c 2005 2009 Bogdan Kreczmer Pola i metody statyczne 6
Metoda statyczna class PrzykladKlasy //...................................................... static int IloscObiektow; PrzykladKlasy( ) ++ IloscObiektow; PrzykladKlasy( ) IloscObiektow; static int RozmiarObiektow( ) return IloscObiektow sizeof(przykladklasy); ; //........................................................................... int PrzykladKlasy :: IloscObiektow = 0; cout << PrzykladKlasy ::RozmiarObiektow( ) << endl; Podobnie jak w przypadku pola statycznego przy wywołaniu metody statycznej nie musimy korzystać z obiektu klasy, dla której jest zdefiniowana ta metoda. Copyright c 2005 2009 Bogdan Kreczmer Pola i metody statyczne 7
#define ROZMIAR TAB 100 class KlasaTestowa //.............................. static int Tab[ROZMIAR TAB]; int Pole1, Pole2; ; //.................................................... int KlasaTestowa:: Tab[ROZMIAR TAB]; int main() KlasaTestowa ObTestowy; cout << cout << Rozmiar(int ): << sizeof(int ) << endl; Rozmiar(KlasaTestowa): << sizeof(obtestowy) << endl; cout << Rozmiar(KlasaTestowa:: Tab): << sizeof(klasatestowa:: Tab) << endl; Bezpośrednio w skład obiektu wchodza tylko jego zwykłe pola. Tak więc to ich rozmiar decyduje o rozmiarze obiektu. Pola statyczne nie wpływaja na jego wielkość. Przykład działania: Rozmiar(int): 4 Rozmiar(KlasaTestowa): 8 Rozmiar(KlasaTestowa:: Tab): 400 Copyright c 2005 2009 Bogdan Kreczmer Pola i metody statyczne 8
class KlasaTestowa _Tab: Pole1: Pole2: int KlasaTestowa::_Tab[10] int main() KlasaTestowa Pole1: Pole2: Bezpośrednimi składnikami obiektu decydujacym o jego rozmiarze sa tylko pola zwykłe. Copyright c 2005 2009 Bogdan Kreczmer Pola i metody statyczne 9
Podsumowanie Pola statyczne powinny reprezentować ogólne atrybuty właściwe dla wszystkich obiektów całej klasy. Pola statyczne nie powinny być wykorzystywane jako zmienne robocze lub zmienne służace do przekazywania wyników pośrednich między metodami. Komunikacja między metodami powinna być realizowana, o ile jest to tylko możliwe, poprzez parametry wywołania. Pola statyczne powinny być tworzone możliwie oszczędnie. Nadużywanie tego mechanizmu świadczy zazwyczaj o złym stylu programowania. Copyright c 2005 2009 Bogdan Kreczmer Pola i metody statyczne 10
Pytania i ćwiczenia 1. Dana jest definicja klasy oraz deklaracje: class KlasaA int PoleZwykle; static int PoleStatyczne; ; KlasaA() PoleZwykle = 0; KlasaA Ob; int KlasaA:: PoleStatyczne = Ob. PoleZwykle; Czy powyższa deklaracja jest poprawna? 2. Dana jest definicja klasy oraz deklaracje: class KlasaA static int Pole; int Wartosc(); ; int KlasaA::Wartosc( ) return KlasaA:: Pole; int KlasaA:: Pole; Czy powyższa definicja metody jest poprawna? Copyright c 2005 2009 Bogdan Kreczmer Pola i metody statyczne 11