21.02.2015 Views

Pola i metody statyczne

Pola i metody statyczne

Pola i metody statyczne

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Pola</strong> i <strong>metody</strong> <strong>statyczne</strong><br />

Bogdan Kreczmer<br />

ZPCiR IIAiR PWr<br />

pokój 307 budynek C3<br />

bogdan.kreczmer@pwr.wroc.pl<br />

Copyright c○2005–2009 Bogdan Kreczmer ⋆<br />

⋆ Niniejszy dokument zawiera materiały do wykładu na temat programowania obiektowego. Jest on udostępniony pod<br />

warunkiem wykorzystania wyłacznie ˛ do własnych prywatnych potrzeb i może on być kopiowany wyłacznie ˛ w całości, razem z<br />

niniejsza˛<br />

strona˛<br />

tytułowa.<br />

˛


Zmienne <strong>statyczne</strong><br />

1<br />

#include <br />

void FunkcjaZPamiecia( )<br />

{<br />

static int IloscWywolan = 0;<br />

}<br />

printf(”Wywolanie nr: %i\n”,++IloscWywolan);<br />

int main( )<br />

{<br />

printf(”Wartosc poczatkowa: %i\n”,<br />

FunkcjaZPamiecia( );<br />

FunkcjaZPamiecia( );<br />

FunkcjaZPamiecia( );<br />

return 0;<br />

}<br />

IloscWywolan);<br />

❤❤❤❤❤❤❤❤❤<br />

✭✭✭✭✭✭✭✭✭<br />

Wynik działania programu (po usunięciu<br />

pierwszej instrukcji):<br />

Wywolanie nr: 1<br />

Wywolanie nr: 2<br />

Wywolanie nr: 3<br />

Zmienne <strong>statyczne</strong> w języku C pełnia˛<br />

rolę zmiennych globalnych z ograniczonym zakresem dostępu<br />

tylko do poziomu funkcji, w której sa˛<br />

deklarowane.<br />

<strong>Pola</strong> i <strong>metody</strong> <strong>statyczne</strong>


Pole <strong>statyczne</strong><br />

2<br />

class PrzykladKlasy { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />

public :<br />

static int IloscObiektow;<br />

PrzykladKlasy( ) { ++ IloscObiektow; }<br />

∼ PrzykladKlasy( ) { −− IloscObiektow; }<br />

}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />

int PrzykladKlasy :: IloscObiektow = 0;<br />

int main( )<br />

{<br />

PrzykladKlasy Ob;<br />

}<br />

cout


Pole <strong>statyczne</strong><br />

3<br />

class PrzykladKlasy { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />

public :<br />

static int IloscObiektow;<br />

PrzykladKlasy( ) { ++ IloscObiektow; }<br />

∼ PrzykladKlasy( ) { −− IloscObiektow; }<br />

}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />

int PrzykladKlasy :: IloscObiektow = 0;<br />

int main( )<br />

{<br />

cout


Pole <strong>statyczne</strong><br />

4<br />

class PrzykladKlasy { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />

public :<br />

static int IloscObiektow;<br />

PrzykladKlasy( ) { ++ IloscObiektow; }<br />

∼ PrzykladKlasy( ) { −− IloscObiektow; }<br />

}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />

int main( )<br />

{<br />

int✭✭✭✭✭✭✭✭✭<br />

❤ ❤❤❤❤❤❤❤❤ PrzykladKlasy<br />

❤❤❤❤❤❤❤❤❤<br />

✭✭✭✭✭✭✭✭✭<br />

:: IloscObiektow<br />

❤❤❤❤❤❤❤❤❤<br />

✭✭✭✭✭✭✭✭✭<br />

= 0;<br />

PrzykladKlasy Ob;<br />

}<br />

cout


Pole <strong>statyczne</strong><br />

5<br />

class PrzykladKlasy { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />

public :<br />

static int IloscObiektow;<br />

PrzykladKlasy( ) { ++ IloscObiektow; }<br />

∼ PrzykladKlasy( ) { −− IloscObiektow; }<br />

}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />

PrzykladKlasy ObGlobalny;<br />

int PrzykladKlasy :: IloscObiektow = 0;<br />

int main( )<br />

{<br />

PrzykladKlasy Ob;<br />

}<br />

cout


Pole <strong>statyczne</strong><br />

6<br />

class PrzykladKlasy { //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />

public :<br />

static int IloscObiektow;<br />

PrzykladKlasy( ) { ++ IloscObiektow; }<br />

∼ PrzykladKlasy( ) { −− IloscObiektow; }<br />

int RozmiarObiektow( ) { return IloscObiektow∗sizeof(PrzykladKlasy); }<br />

}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />

int PrzykladKlasy :: IloscObiektow = 0;<br />

int main( )<br />

{<br />

PrzykladKlasy Ob;<br />

}<br />

cout


Metoda statyczna<br />

7<br />

class PrzykladKlasy { //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />

public :<br />

static int IloscObiektow;<br />

PrzykladKlasy( ) { ++ IloscObiektow; }<br />

∼ PrzykladKlasy( ) { −− IloscObiektow; }<br />

static int RozmiarObiektow( )<br />

{ return IloscObiektow∗sizeof(PrzykladKlasy); }<br />

}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />

int PrzykladKlasy :: IloscObiektow = 0;<br />

int main( )<br />

{<br />

cout


Pole <strong>statyczne</strong><br />

8<br />

#define ROZMIAR TAB 100<br />

class KlasaTestowa { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />

public :<br />

static int Tab[ROZMIAR TAB];<br />

int Pole1, Pole2;<br />

}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />

int KlasaTestowa:: Tab[ROZMIAR TAB];<br />

int main()<br />

{<br />

KlasaTestowa ObTestowy;<br />

}<br />

cout


Pole <strong>statyczne</strong><br />

8<br />

#define ROZMIAR TAB 100<br />

class KlasaTestowa { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />

public :<br />

static int Tab[ROZMIAR TAB];<br />

int Pole1, Pole2;<br />

}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />

int KlasaTestowa:: Tab[ROZMIAR TAB];<br />

int main()<br />

{<br />

KlasaTestowa ObTestowy;<br />

}<br />

cout


Pole <strong>statyczne</strong><br />

9<br />

Bezpośrednimi składnikami obiektu decydujacym ˛ o jego rozmiarze sa˛<br />

tylko pola zwykłe.<br />

<strong>Pola</strong> i <strong>metody</strong> <strong>statyczne</strong>


Podsumowanie<br />

10<br />

• <strong>Pola</strong> <strong>statyczne</strong> powinny reprezentować ogólne atrybuty właściwe<br />

dla wszystkich obiektów całej klasy.<br />

• <strong>Pola</strong> <strong>statyczne</strong> nie powinny być wykorzystywane jako<br />

zmienne robocze lub zmienne służace ˛ do przekazywania wyników<br />

pośrednich między metodami. Komunikacja między<br />

metodami powinna być realizowana, o ile jest to tylko możliwe,<br />

poprzez parametry wywołania.<br />

• <strong>Pola</strong> <strong>statyczne</strong> powinny być tworzone możliwie oszczędnie.<br />

Nadużywanie tego mechanizmu świadczy zazwyczaj o złym<br />

stylu programowania.<br />

<strong>Pola</strong> i <strong>metody</strong> <strong>statyczne</strong>


Pytania i ćwiczenia<br />

11<br />

1. Dana jest definicja klasy oraz deklaracje:<br />

class KlasaA {<br />

public :<br />

int PoleZwykle;<br />

static int PoleStatyczne;<br />

};<br />

KlasaA() { PoleZwykle = 0; }<br />

KlasaA Ob;<br />

int KlasaA:: PoleStatyczne = Ob. PoleZwykle;<br />

Czy powyższa deklaracja jest poprawna?<br />

2. Dana jest definicja klasy oraz deklaracje:<br />

class KlasaA {<br />

public :<br />

static int Pole;<br />

int Wartosc();<br />

};<br />

int KlasaA::Wartosc( )<br />

{<br />

return KlasaA:: Pole;<br />

}<br />

int KlasaA:: Pole;<br />

Czy powyższa definicja <strong>metody</strong> jest poprawna?<br />

<strong>Pola</strong> i <strong>metody</strong> <strong>statyczne</strong>

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!