JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 10 1
KLASY I OBIEKTY W definicji klasy dane składwe nie mgą być inicjalizwane. Mgą im być nadawane wartści za pmcą funkcji składwych klasy, (np. funkcji ustaw()) lub knstruktra klasy ( tym niec później...). Funkcje składwe klasy mżna definiwać: class Samchd { public: string mdel="punt"; // Błąd! int rk_prdukcji=2012; // Błąd! //... }; a) wewnątrz definicji klasy wówczas stają się funkcjami inline (zatem należy ten wariant stswać jedynie przy krótkich funkcjach); np.: class Liczba { int x; public: int y; vid drukuj() { cut<<x<<" "<<y<<endl; }; // definicja wewnątrz klasy vid przypisz(int xx) { x=xx; } // definicja wewnątrz klasy }; 2
KLASY I OBIEKTY b) na zewnątrz definicji klasy (zazwyczaj) wówczas należy skrzystać z peratra zasięgu :: by kreślić klasę, d której należy funkcja. class Pralka //fragment definicji klasy Pralka { int nr_prgramu; int temperatura_prania; public: vid pranie(int prgram,int temperatura); //deklaracja funkcji //... }; //---------------------------------------------------------- vid Pralka::pranie(int prgram,int temperatura) //zauważ :: { //funkcja zdefiniwana pza ciałem klasy //... } 3
KLASY I OBIEKTY Obiekty jak argumenty funkcji: 1. Przesyłanie przez wartść: dmyślnie biekty są przesyłane przez wartść (tak jak przy typach wbudwanych); funkcja twrzy kpię biektu zajmuje t czas (i pamięć); funkcja spza klasy pracując na biekcie przesłanym przez wartść (czyli jeg kpii) nie ma mżliwści mdyfikacji przesłaneg biektu. 2. Przesyłanie przez referencję: funkcja pracuje na ryginale nie jest twrzna kpia biektu; funkcja spza klasy pracując na biekcie przesłanym przez referencję ma mżliwść mdyfikacji przesłaneg biektu. 4
KLASY I OBIEKTY Przykład: 5
KLASY I OBIEKTY Prgramy biektwe złżne z wielu plików Każda klasa pwinna być zdefiniwana w sbnym pliku nagłówkwym (z rzszerzeniem.h), np.: mja_klasa.h Definicje funkcji składwych pszczególnych klas umieszczane są w sbnych plikach kdu źródłweg (z rzszerzeniem.cpp) tej samej pdstawwej części nazwy, c plik nagłówkwy, np.: mja_klasa.cpp Funkcja główna prgramu (main()) umieszczana jest we właściwym pliku prgramwym (z rzszerzeniem.cpp), np.: prgramik.cpp Pliki nagłówkwe są włączane (za pmcą dyrektywy #include) d każdeg pliku kdu źródłweg, w którym wykrzystywana jest dana klasa, np.: #include "mja_klasa.h" jest umieszczane na pczątku plików: mja_klasa.cpp raz prgramik.cpp 6
KLASY I OBIEKTY Prgramy biektwe złżne z wielu plików Dlaczeg każda klasa pwinna być zdefiniwana w sbnym pliku nagłówkwym? Zmiana w kdzie jedneg z plików składwych prjektu skutkuje kniecznścią kmpilacji wyłącznie teg pliku. Stwrzna klasa mże być wykrzystywana w wielu różnych prgramach. Strażnik nagłówka t zestaw dyrektyw preprcesra (kmpilacja warunkwa) chrniących użytkwników klasy przed myłkwym dwukrtnym włączeniem teg sameg pliku nagłówkweg, np.: #ifndef MOJA_KLASA_H_INCLUDED #define MOJA_KLASA_H_INCLUDED // tutaj właściwa treść pliku mja_klasa.h #endif // MOJA_KLASA_H_INCLUDED 7
KLASY I OBIEKTY Przykład: 8
KLASY I OBIEKTY Przykład: 9
Bardz przydatne funkcje składwe klasy: Knstruktr niczeg nie knstruuje (mim swej nazwy); Destruktr niczeg nie niszczy (mim swej nazwy); Knstruktr jest funkcją, która jest wywływana autmatycznie w mmencie twrzenia biektu. Destruktr jest funkcją, która jest wywływana autmatycznie w mmencie likwidwania biektu. Mżna zatem zlecić im pewne czynnści... 10
Typy wbudwane: mżna stwrzyć zmienną i d razu nadać jej wartść (inicjalizacja), np.: Klasy: flat zm=10.56; Dla biektu klasy przez nas stwrznej należy: 1. Stwrzyć biekt. 2. Wpisać wartść d danej składwej biektu. Np. jeśli mamy następującą klasę: class Dane {public: flat wartsc; }; T: Dane liczba; liczba.wartsc=10.56; Knstruktr umżliwia nadanie wartści pczątkwych biektm. 11
Knstruktr Jest t specjalna funkcja składwa klasy, która ma nazwę identyczną z nazwą klasy. np., jeśli mamy następującą klasę: class Rwer // definicja klasy Rwer { //... // ciał klasy }; t knstruktr mże mieć pstać (tu: tylk deklaracja wewnątrz ciała klasy): Rwer(); a jeg definicja (tu: na zewnątrz klasy): // deklaracja knstruktra klasy Rwer Rwer::Rwer() // definicja knstruktra klasy Rwer { //... // ciał knstruktra } 12
Rzbudujmy klasę Dane knstruktr: class Dane {public: flat wartsc; }; class Dane {public: flat wartsc; Dane(flat w); //knstruktr (deklaracja) }; Dane::Dane(flat w) //knstruktr (definicja) { wartsc=w; } A teraz mżemy stwrzyć biekt tak: Dane liczba(10.56); Ewentualnie tak: Dane liczba=dane(10.56); 13
Knstruktr Przed nazwą knstruktra nie mże być żadneg kreślenia typu zwracaneg (zatem nie mże być na kńcu jeg definicji słwa return). Knstruktr mże służyć d nadania wartści pczątkwych danym składwym biektu (jest więc dekratrem wnętrz...) Jeśli w klasie nie ma zdefiniwaneg żadneg knstruktra, t kmpilatr wygeneruje tzw. knstruktr dmniemany (jednak ten knstruktr nie wykna żadneg przypisania...) Knstruktr mże wywłać inną funkcję składwą swjej klasy. Przykład klasy z knstruktrem następny slajd: 14
Przykład: 15
Knstruktr jest funkcją, przy której najczęściej sptyka się przeładwanie nazwy. Rzbudwując nasz przykład: 16
Przykład: 17
Destruktr Jest t specjalna funkcja składwa klasy, która ma nazwę identyczną z nazwą klasy pprzedzną znakiem tyldy (~). np.: ~Dane(); - deklaracja destruktra klasy Dane. Przed nazwą destruktra nie mże być żadneg kreślenia typu zwracaneg. Destruktr jest funkcją, która jest wywływana autmatycznie w mmencie likwidwania biektu (tak tak, t już był...). Destruktr jest wywływany bez żadnych argumentów. W związku z tym jest funkcją, której nazwy nie mżna przeładwać. 18
Destruktr Destruktr sam niczeg nie likwiduje jeśli istnieje, t mże wyknać pewne prace prządkwe tuż przed tym, jak biekt zstanie zlikwidwany. Destruktr mże wywłać inną funkcję składwą swjej klasy. Jeśli w klasie nie ma zdefiniwaneg jawneg destruktra, kmpilatr sam wygeneruje destruktr. P c? (przykłady): Jeśli biekt dknał rezerwacji pamięci peratrem new, t przed likwidacją biektu należy tą pamięć zwlnić w destruktrze peratrem delete. Destruktr mże się przydać, gdy zliczane są biekty danej klasy. W knstruktrze licznik jest zwiększany jeden, natmiast w destruktrze zmniejszany 1 (jak zliczać biekty w dalszej części wykładu). Jeśli likwidacja biektu wymaga ddatkwych działań (wypisanie infrmacji, zlikwidwanie czegś na ekranie). 19
Definicja klasy Dane wzbgacna destruktr: class Dane { private: int rk_ur; string Imie, Nazwisk; public: Dane(string im, string naz, int ru) // knstruktr 1 {Imie=im; Nazwisk=naz; rk_ur=ru;} Dane(string im, string naz) // knstruktr 2 {Imie=im; Nazwisk=naz; rk_ur=0;} ~Dane() // destruktr {cut<<"likwiduje biekt nazwisku: "<<Nazwisk<<endl;} vid wyswietl(); // zwykła f. składwa }; 20
Knstruktr z argumentami dmyślnymi Knstruktry mgą psiadać argumenty dmyślne (wszystkie bądź nie). Przypmnienie: argumenty dmyślne umieszcza się najbardziej z prawej strny. Knstruktr dmyślny t taki knstruktr w którym wszystkie argumenty mają kreślne wartści dmyślne. W danej klasie mże istnieć tylk jeden knstruktr dmyślny. 21
Knstruktr z argumentami dmyślnymi Knstruktr dmyślny mże być alb wywłany bez pdania żadnych argumentów (wszystkie argumenty są wtedy dmyślne) alb z ich pdaniem. Dmyślne argumenty w knstruktrze dmyślnym deklaruje się wyłącznie w prttypie funkcji knstruktra w definicji klasy pliku nagłówkweg, np.: Klasa_pierwsza(int=0,flat=0,string= tekst ); czyli jest tak, jak gdyby istniały cztery knstruktry: Klasa_pierwsza(int,flat,string); Klasa_pierwsza(int,flat); Klasa_pierwsza(int); Klasa_pierwsza(); 22
Przykład: 23