PROGRAMOWANIE OBIEKTOWE W C++ - cz 1 Definicja klasy, składniki klasy, prawa dost pu, definiowanie funkcji składowych, konstruktory i destruktory. Program komputerowy opisuje w pewien sposób rzeczywisto. W odniesieniu do sposobu definiowania przedmiotów wyst puj cych w rzeczywisto ci wykształciły si dwa zasadnicze podej cia: PROCEDURALNE - tworzymy struktur zawieraj c parametry definiuj ce przedmiot i jego stan, a odseparowane funkcje okre laj jego wła ciwo ci struct punkt int x,y; ; void rysuj(struct punkt p) // ciało funkcji OBIEKTOWE - dane definiuj ce przedmiot i metody (funkcje składowe) okre laj ce jego wła ciwo ci umieszczamy we wspólnym miejscu - klasie class PUNKT int x,y; void rysuj(void); ; Definicja klasy słowo kluczowe nazwa klasy class nazwa_typu // ciało klasy, czyli okreslenie z czego składa si klasa ; rednik Zmienne powyszego typu nazywa si obiektami. Jeli chcemy utworzy obiekt powyszej klasy, to podobnie jak przy deklaracji innych zmiennych podajemy nazw typu i nazw obiektu: nazwa_typu x; nazwa_typu *y; PUNKT x; PUNKT *y; - obiekt klasy nazwa_typu - wskanik na obiekty typu nazwa_typu 1
Składniki klasy Składnikami klasy mog by: - dane (dane składowe, pola, atrybuty) - oznaczaj to samo co pola w strukturach, char nazwisko [30]; ; Do danych w klasie odwołujemy si w taki sam sposób jak w strukturach do jej pól: obiekt.dana wska nik->dana osoba x,*y; x.wiek = 15; y = &x; y->wiek = 20; - funkcje (metody) - s to funkcje operuj ce na danych składowych klasy char nazwisko [30]; void zapisz(char *i, char *n, int w); ; - funkcja Do funkcji w klasie odwołujemy si w taki sam sposób jak do jej danych. obiekt.funkcja(argumenty) wska nik->funkcja(argumenty) osoba x,*y; x.zapisz( Jan, Kowalski,30); y = &x; y->zapisz( Adam, Kowalski,25); Deklaracje danych i funkcji mog by umieszczane w klasie w dowolnej kolejnoci. Niezalenie od miejsca zdefiniowania składnika wewn trz klasy - składnik znany jest w całej definicji klasy. Prawa dost pu do składników klasy Dla składników klasy (danych i funkcji) okre la si trzy prawa dost pu: - private (prywatne) oznacza, e funkcje i dane klasy dost pne s tylko z wn trza klasy. Dla danych oznacza to, e tylko funkcje b d ce składnikami klasy mog te dane odczytywa lub do nich co zapisywa. Dla funkcji oznacza to, e mog one 2
zosta wywołane tylko przez inne funkcje składowe tej klasy (oraz tzw. funkcje zaprzyja nione). Jest to warto domy lna, czyli je li nie zdefiniujemy sami uprawnie, to składniki maja prawo dost pu private, - public (publiczne) - komponenty publiczne s ogólnie dost pne, mo na si do nich odwoływa z wn trza klasy lub spoza klasy tak samo jak do pól struktur lub funkcji, - protected (zabezpieczone) - dost p jest taki sam jak dla private, ale dodatkowo s one dost pne dla klas wywodz cych si od tej klasy (dziedziczenie). Definiowanie funkcji składowych wewn trz klasy funkcja zdefiniowana wewn trz klasy jest funkcj inline, tzn. e podczas kompilacji wsz dzie tam, gdzie wyst puje wywołanie funkcji zostanie wstawiony jej kod void zapisz(char *i, char *n, int w) void drukuj(void) printf( %s %s, wiek: %d\n,imie,nazwisko,wiek); ; void zapisz(char *i, char *n, int w); ; deklaracje funkcji void osoba::zapisz(char *i, char *n, int w) :: - operator zakresu, pokazuje do jakiej klasy nale y funkcja void osoba::drukuj(void) printf( %s %s, wiek: %d\n,imie,nazwisko,wiek); 3
Konstruktor osoba(char *i,char *n,int w); ; osoba::osoba(char *i,char *n,int w) - konstruktor słu y do nadania warto ci pocz tkowych obiektowi (cho nie tylko), - wywoływany jest w momencie tworzenia obiektu, - mo e mie kilka wariantów czyli ró n liczb parametrów (przeładowanie), - nazwa konstruktora jest taka sama jak nazwa klasy, - dla konstruktora nie okre lamy typu zwracanej warto ci (nie mo e tam wyst pi nawet void). bez konstruktora: z konstruktorem: lub osoba os1; os1.zapisz( Jan, Kowalski,30); osoba os1( Jan, Kowalski,30); osoba os1 = osoba( Jan, Kowalski,30); Destruktor osoba(char *i,char *n,int w); ~osoba(void); ; osoba::~osoba()... - destruktor wywoływany jest wtedy, gdy obiekt jest likwidowany (destruktor mo na wywoła jawnie - nie spowoduje on jednak usuni cia obiektu), - jego nazwa jest taka sama jak nazwa klasy, ale przed jego nazw umieszcza si znak ~, - zadaniem destruktora jest posprz tanie po obiekcie, np. zwolnienie pami ci, - dla destruktora nie okre lamy typu zwracanej warto ci. 4
(zastosowanie konstruktora i destruktora) #include <stdio.h> #include <conio.h> #include <string.h> char *imie; char *nazwisko; osoba(char *i, char *n, int w); ~osoba(); void drukuj(); ; osoba::osoba(char *i, char *n, int w) imie = new char[strlen(i)+1]; nazwisko = new char[strlen(n)+1]; osoba::~osoba() delete imie; delete nazwisko; void osoba::drukuj() printf("%s %s, wiek: %d\n",imie,nazwisko,wiek); int main() osoba os1("jan","kowalski",30); clrscr(); os1.drukuj(); getch(); return 0; 5