Lekcja 25LEKCJA 25
Funkcje i dane statyczne
W utworzonych przez nas dotychczas programach każdy deklarowany obiekt miał swój
własny zbiór danych. Możesz jednak pisać aplikacje, w których będziesz chciał,
aby obiekty tej samej klasy dzieliły wspólne dane. Na przykład, załóżmy, że
piszesz program obsługujący listę płac, który rejestruje godziny przepracowane
przez 1000 zatrudnionych. Aby ustalić wysokość podatku, program musi wiedzieć, w
jakim stanie dany zatrudniony pracuje. Zatem klasa będzie zawierać składową
stan. Jeśli jednak wszyscy zatrudnieni pracują w tym samym stanie, to wszystkie
obiekty opisujące pracowników powinny dzielić tę samą składową.
W ten sposób program może zmniejszyć ilość potrzebnej pamięci eliminując 999
kopii tej samej informacji. Aby składowa klasy była dzielona, musisz
zadeklarować ją jako static. Podczas tej lekcji przedstawimy, jakie kroki
powinieneś wykonać, aby obiekty mogły dzielić wspólne składowe. Pod koniec tej
lekcji będziesz rozumiał następujące zagadnienia podstawowe:
W C++ obiekty jednej klasy mogą dzielić wspólne składowe.
Gdy przypiszesz w programie wartość wspólnej składowej, to wszystkie obiekty
danej klasy mają natychmiast dostęp do nowej wartości.
Aby utworzyć dzieloną składową klasy, należy poprzedzić jej nazwę słowem
kluczowym static.
Po zadeklarowaniu statycznej składowej klasy musisz w programie utworzyć
zmienną globalną (na zewnątrz definicji klasy) odpowiadającą dzielonej
składowej klasy.
Przy użyciu słowa kluczowego static możesz zadeklarować metodę klasy, którą
można wywoływać bez definiowania w programie obiektu tej klasy.
Dzielenie wspólnych składowych danych
Zazwyczaj, gdy tworzysz obiekty określonej klasy, to każdy obiekt ma własny
zbiór danych. Może się jednak zdarzyć tak, że obiekty jednej klasy powinny
dzielić wspólne składowe danych. W takich sytuacjach powinieneś deklarować te
składowe jako publiczne lub prywatne i poprzedzać ich typy słowem kluczowym
stalic, np.
private:
static int wspolna_wartosc;
Po zdefiniowaniu klasy musisz na zewnątrz klasy zdefiniować tę składową jako
zmienną globalną:
int nazwa_klasy::wspolna_wartosc;
Przedstawiony poniżej program DZIEL.CPP definiuje klasę seria_ksiazek, w której
składowa liczba_stron jest wspólna dla wszystkich obiektów klasy (serii). Jeśli
w programie zmieniasz wartość tej składowej, to nowa jej wartość jest
natychmiast widoczna dla wszystkich obiektów klasy:
#include
#include
class seria_ksiazek {
public:
seria_ksiazek (char *, char *, float);
void inf_o_ksiazce (void);
void liczba_stron (int);
private:
static int stron;
char tytul[64];
char autor[64];
float cena;
};
int seria_ksiazek::stron;
void seria_ksiazek::liczba_stron (int liczba)
{
stron = liczba;
}
seria_ksiazek::seria_ksiazek (char *tytul, char *autor, float cena)
{
strcpy (seria_ksiazek::tytul, tytul);
strcpy (seria_ksiazek::autor, autor);
seria_ksiazek::cena = cena;
}
void seria_ksiazek::inf_o_ksiazce (void);
{
cout << "Tytuł: " << tytul << endl;
cout << "Autor: " << autor << endl;
cout << "Cena: " << cena << endl;
cout << "Liczba stron: " << stron << endl;
}
void main(void)
{
seria_ksiazek programowanie ("Wygraj z C++", "Jamsa", 22.95);
seria_ksiazek word ("Wygraj z Word for Windows", "Wyatt", 19.95);
word.liczba_stron (256);
programowanie.inf_o_ksiazce ();
word..inf_o_ksiazce ();
cout << endl << "Zmiana liczby stron" << endl;
programowanie.liczba_stron (512);
programowanie.inf_o_ksiazce ();
word..inf_o_ksiazce ();
}
Jak widzimy, składowa stron została zadeklarowana w klasie jako stalic int. Tuż
za definicją klasy jest zadeklarowana składowa stron jako zmienna globalna. Gdy
program zmienia wartość składowej stron, to nowa wartość jest natychmiast
widoczna dla wszystkich obiektów klasy seria_ksiazek.
Wspólne składowe klasy
Może się zdarzyć, że w programie różne obiekty klasy powinny mieć wspólne pewne
dane. Należy w tym celu zadeklarować odpowiednie składowe jako statyczne
(static). Następnie powinieneś zadeklarować te składowe na zewnątrz klasy jako
zmienne globalne. Zmiana tych składowych będzie natychmiast odzwierciedlona we
wszystkich obiektach klasy.
Korzystanie z publicznych składowych statycznych, gdy nie utworzono obiektów
Jak mówiliśmy przed chwilą, po zadeklarowaniu statycznej składowej klasy ta
składowa jest wspólna dla wszystkich obiektów danej klasy. Może się jednak
zdarzyć tak, że program nie utworzył jeszcze żadnego obiektu tej klasy, a musi
użyć jej składowej. Aby móc korzystać ze składowej, program musi zadeklarować ją
jako publiczną i statyczną. Na przykład poniższy program UZYJSKL.CPP używa
składowej stron klasy seria_ksiazek, choć nie istnieją żadne obiekty tej klasy:
#include
#include
class seria_ksiazek {
public:
static int stron;
private:
char tytul[64];
char autor[64];
float cena;
};
int seria_ksiazek::stron;
void main(void)
{
seria_ksiazek::stron = 256;
cout << "Liczba stron wynosi: " << seria_ksiazek::stron << endl;
}
W tym przykładzie program ma dostęp do składowej klasy, mimo że nie utworzono
żadnych obiektów klasy seria_ksiazek. Tak jest dlatego, że składowa stron
została w klasie zdefiniowana jako publiczna i statyczna.
Używanie statycznych funkcji składowych
Przedstawione programy ilustrują używanie statycznych składowych danych klasy.
Analogicznie możesz w C++ definiować statyczne funkcje składowe (metody). Gdy
metoda jest statyczna, to program może ją wywoływać nawet jeśli nie zostały
utworzone żadne obiekty danej klasy. Jeśli na przykład klasa zawiera metodę,
która może być wykorzystywana dla danych spoza klasy, to aby ją udostępnić,
powinieneś zadeklarować ją jako statyczną. Na przykład przedstawiona poniżej
klasa menu przy użyciu sekwencji escape drivera ANSI czyści ekran komputera.
Jeśli w twoim systemie jest zainstalowany driver urządzenia ANSI.SYS, to możesz
wykorzystywać metodę czysc_ekran do opróżniania ekranu. Ponieważ ta metoda jest
zadeklarowana jako statyczna, to program może ją wywoływać, mimo że nie istnieją
żadne obiekty klasy menu. Przedstawiony poniżej program CLR_SCR.CPP przy użyciu
metody czysc_ekran czyści ekran komputera:
#include
class menu {
public:
static void czysc_ekran (void);
//Inne metody
private:
int liczba_opcji_menu;
};
void menu::czysc_ekran (void)
{
cout << '\033' << "[2J";
}
void main(void)
{
menu.czysc_ekran ();
}
Ponieważ składowa czysc_ekran jest zadeklarowana jako statyczna, program może
używać tej funkcji, mimo że nie zostały utworzone żadne obiekty klasy menu.
Funkcja korzysta z sekwencji ANSI Esc[2J. Więcej informacji na temat sekwencji
escape ANSI znajdziesz w książce Jamsa's 1OO1 C/C++ Tips, Jamsa Press 1993.
Udostępnianie metod klasy
Może się zdarzyć, że funkcja, którą utworzyłeś jako metodę klasy, może być
przydatna w operacjach nie związanych z tą klasą. Na przykład przedstawiona
klasa menu zawiera funkcję czysc_ekran, która może być potrzebna w dowolnym
miejscu programu. Jeśli chcesz korzystać z metody klasy poza obiektami tej
klasy, to powinieneś zadeklarować ją jako statyczną i publiczną:
public:
static void czysc_ekran (void);
W programie wywołujesz funkcję przy użyciu operatora widoczności:
menu::czysc_ekran();
Zapamiętaj
Podczas tej lekcji dowiedziałeś się, w jaki sposób wszystkie obiekty pewnej
klasy mogą dzielić wspólne dane, gdy poprzedzisz deklaracje odpowiednich
składowych słowem kluczowym stalic. Jeśli składowa danych klasy jest publiczna i
statyczna, to program ma do niej dostęp nawet jeśli nie istnieją żadne obiekty
tej klasy. Analogicznie, jeśli poprzedzisz deklarację publicznej metody słowem
kluczowym static, to program będzie mógł ją wywoływać w operacjach nie
związanych z obiektem danej klasy. Podczas lekcji 26 nauczysz się, jak przy
użyciu dziedziczenia można tworzyć obiekt z obiektów już istniejących. Tworzenie
nowych obiektów, korzystając z dziedziczenia, pozwoli Ci zaoszczędzić wiele
pracy. Zanim jednak przejdziemy do lekcji 26 upewnij się, że opanowałeś już
następujące zagadnienia podstawowe:
Składowa klasy zadeklarowana jako statyczna jest wspólna dla wszystkich
obiektów tej klasy.
Gdy zadeklarowałeś składową danych klasy jako statyczną, musisz poza klasą
zadeklarować zmienną globalną odpowiadającą wspólnej danej.
Jeśli zadeklarowałeś składową klasy jako publiczną i statyczną, to możesz w
programie korzystać z tej składowej, nawet jeśli nie istnieje żaden obiekt tej
klasy. Program ma dostęp do tej składowej przy użyciu operatora widoczności,
np. nazwa_klasy::nazwa_skladowej.
Jeśli zadeklarowałeś publiczną statyczną funkcję składową, to program może ją
wywoływać, nawet jeśli nie istnieje żaden obiekt tej klasy. Program ma dostęp
do tej metody przy użyciu operatora widoczności, np. nazwa_klasy::czysc_ekran.
WsteczSpis treściDalej
Wyszukiwarka
Podobne podstrony:
Kris Jamsa Wygraj Z C lekcja32
Kris Jamsa Wygraj Z C lekcja 5
Kris Jamsa Wygraj Z C lekcja23
Kris Jamsa Wygraj Z C lekcja38
Kris Jamsa Wygraj Z C lekcja35
Kris Jamsa Wygraj Z C lekcja20
Kris Jamsa Wygraj Z C lekcja27
Kris Jamsa Wygraj Z C lekcja34
Kris Jamsa Wygraj Z C lekcja18
Kris Jamsa Wygraj Z C lekcja17
Kris Jamsa Wygraj Z C lekcja14
Kris Jamsa Wygraj Z C lekcja36
Kris Jamsa Wygraj Z C lekcja 4
Kris Jamsa Wygraj Z C lekcja33
Kris Jamsa Wygraj Z C lekcja 7
Kris Jamsa Wygraj Z C lekcja30
Kris Jamsa Wygraj Z C lekcja12
Kris Jamsa Wygraj Z C lekcja28
Kris Jamsa Wygraj Z C lekcja 6
więcej podobnych podstron