Pola i metody statyczne
Pola i metody statyczne
Pola i metody statyczne
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>