12:00 | Temat wykladu: | |
C++: Obiektowość dla zaawansowanych (by MeMeK, 16.08.06) @ wyklady.net | ||
12:08 | MeMeK | witam was na dzisiejszym wykladzie |
MeMeK | bedzie on traktowal o technice oop | |
MeMeK | obiect oriented programming | |
12:09 | MeMeK | przypominam ze wyklad berdzie mozna komentowac po jego zakonczeniu |
MeMeK | http://forum.wyklady.net/index.php?topic=74.0 | |
MeMeK | o tu | |
MeMeK | o czym bedzie juz powiedzialem | |
MeMeK | powiemy o budowie klas | |
MeMeK | po co je stosowac | |
12:10 | MeMeK | i roznych rzeczach jak konstruktory itp |
MeMeK | oczywiscie nie zabraknie polimorfizmu | |
MeMeK | wiec k lecimy | |
MeMeK | kiedy piszemy program | |
MeMeK | mozemy bardzo latwo stworzyc sobie | |
12:11 | MeMeK | np jakis napis czy liczbe |
MeMeK | wystarczy do tego krotka deklaracja | |
MeMeK | int zmienna; | |
MeMeK | ale to so tylko proste rzeczy | |
MeMeK | liczba | |
12:12 | MeMeK | nie daje za duzo mozliwosci |
MeMeK | wyobrazmy sobie ze chcemy zaimplementowac samochod | |
MeMeK | http://memek.piwko.pl/wyklad_obiekt/przyklad1.cpp | |
MeMeK | zerknijcie | |
12:13 | MeMeK | mamy tam bardzo prosta lapotologiczna definiecje jakiegos samochodu |
MeMeK | string kolor = "czerwony"; | |
MeMeK | string marka = "audi"; | |
MeMeK | string model = "A6"; | |
MeMeK | int dlugosc_mm = 4523; //dlugosc samochodu w milimetrach | |
MeMeK | int szerokosc_mm = 1607 // szerokosc samochodu w milimetrach | |
MeMeK | int wysokosc_mm = 1458; | |
MeMeK | . | |
MeMeK | . | |
MeMeK | . | |
MeMeK | (...) | |
MeMeK | */ | |
MeMeK | void zmien_bieg (int na_jaki); // -1 wsteczny, 0 luz, 1 jedynka .... | |
MeMeK | void hamuj (); | |
MeMeK | void sprzeglo(); | |
MeMeK | no fajnie | |
MeMeK | ale teraz np | |
MeMeK | wybrazmy sobie ze robimy gre | |
12:14 | MeMeK | wyscigowke tak zwana |
MeMeK | i potrzebujemy 50 samochodow | |
MeMeK | czy jestesmy zmuszeni do przepisywania tego skrawka kodu 50 razy | |
12:15 | MeMeK | ile z tym klopotu |
MeMeK | przeciez nazwy beda musialy byc w kazdym inne | |
MeMeK | oczywiscie mozemy zrobic osobne przestrzenie nazw | |
MeMeK | dla kazdego auta | |
MeMeK | ale po co | |
MeMeK | czy nie mozna tego zrobic raz | |
12:16 | MeMeK | i potem uzywac wielokrotnie |
MeMeK | jak np typ | |
MeMeK | integer | |
MeMeK | okazuje sie ze mozna | |
MeMeK | stworzymy swoj wlasny typ | |
MeMeK | i bedzie mozna z nim postepowac (prawie) tak jak z typami wbudowanymi | |
12:17 | MeMeK | ale jak to zrobic? |
MeMeK | ano zbudujmy klase ;> | |
MeMeK | oto jej prosta budowa | |
MeMeK | class nazwa_klasy | |
MeMeK | { | |
MeMeK | /wnetrze | |
MeMeK | }; //pamietajmy o sredniku | |
MeMeK | class nazwa_klasy | |
MeMeK | { | |
MeMeK | /wnetrze | |
MeMeK | }; //pamietajmy o sredniku | |
12:18 | MeMeK | ok teraz wystarczy wrzucic nasze "czesci" samochodu do srodka |
MeMeK | i mamy fabryke aut ;> | |
MeMeK | fajnie | |
MeMeK | ale co mozemy wrzucic do srodka | |
MeMeK | w zasadzie ogolnie mowiac moga to byc 2 rzeczy | |
MeMeK | jakas dana skladowa | |
12:19 | MeMeK | np lancuch znakow |
MeMeK | a takze mozna wrzucic tam funkcje | |
MeMeK | tzw funkcja skladowa | |
MeMeK | zwana takze metoda | |
12:20 | MeMeK | ok to robimy klase "samochod" |
MeMeK | http://memek.piwko.pl/wyklad_obiekt/przyklad2.cpp | |
dragon | re | |
MeMeK | i teraz jak latwo storzyc nowy egzemlarz autka | |
MeMeK | samochod moj; | |
MeMeK | zupelnie jak typy wbudowane | |
12:21 | MeMeK | a o to nam przeciez chodzilo ;> |
MeMeK | jak widac mozemy dostac sie do skladnika klasy | |
MeMeK | za pomoca kropki | |
MeMeK | . | |
MeMeK | moj.kolor = "czerwony"; | |
12:22 | MeMeK | gdybysmy mieli wskaznik na typ samochod i ustawili go na obiekt "moj" |
MeMeK | dostanie sie do skladnika wygladaloby mniej wiecej tak | |
MeMeK | p_moj->kolor = "czerwony"; | |
12:23 | MeMeK | czyli przez wzkaznik robimy to za pomoca strzalki |
MeMeK | -> | |
MeMeK | http://memek.piwko.pl/wyklad_obiekt/przyklad3.cpp | |
12:24 | MeMeK | mozna zrobic za jednym zamachem kilka aut |
MeMeK | samochod moj, twoj, jego, jej, mamy, taty, wujka; | |
MeMeK | <Robo>l p_moj->kolor = "czerwony"; to jest to samo co *p_moj.kolor = "czerwony"; ? | |
12:25 | MeMeK | odpowiedz brzmi nie |
MeMeK | za pomoca * przy wzkazniku | |
MeMeK | dostajemy sie do pamieci wzkaznika | |
MeMeK | jego zawartosci | |
MeMeK | a jego zawartoscia jest adres | |
MeMeK | a my chcemy dostac sie do tego na co pokazuje | |
MeMeK | wiec bez gwiazdki | |
12:26 | MeMeK | ok |
MeMeK | class samochod | |
MeMeK | { | |
MeMeK | public: | |
MeMeK | co to jest to public: | |
MeMeK | to jest taka specjalna etykieta wewnatrz klasy | |
12:27 | MeMeK | ktora mowi nam o wlasciwosciach skladnikow |
MeMeK | pod nia | |
MeMeK | moga byc 3 rozne etykiety dostepu | |
MeMeK | public | |
MeMeK | czyli dostepne dla wszystkich | |
MeMeK | to znaczy ze do skladnika klasy moze sie dostac kazdy | |
12:28 | MeMeK | protected |
MeMeK | czyli dla siebie i rodzinki (o dziedziczeniu pozniej) | |
MeMeK | no i dla kolegow (tez o tym pozniej) | |
12:29 | MeMeK | private] |
MeMeK | czyli tylko dla siebie | |
MeMeK | (i kolegow) | |
MeMeK | powiem jeszcze ze private jest domyslne | |
MeMeK | czyli jak nie podamy zadnej etykiety to wszystko bedzie provate | |
12:30 | MeMeK | *private |
MeMeK | ale po co tak ukrywac skladniki klasy??? | |
MeMeK | jest kilka powodow | |
MeMeK | btw. takie ukrywanie nazywa sie fachowo | |
MeMeK | enkapsulacja | |
MeMeK | albo h | |
MeMeK | hermetyzacja | |
12:31 | MeMeK | robi sie to dlatego ze nie wszystko powinno byc dostepne |
MeMeK | np nasza klasa samochod | |
MeMeK | ma funkce skladowa hamuj() | |
12:32 | MeMeK | ale przeciez hamuj() musi wywolac inne funkcje skladowe |
MeMeK | np | |
MeMeK | zacisnij_klocki() | |
MeMeK | napnij_pasy | |
MeMeK | wyprostuj_siedzenia | |
MeMeK | a przeciez normalnie nie mozemy np zacisnac klocko | |
MeMeK | nie ma takiego samochodu ;> | |
MeMeK | ok | |
12:33 | MeMeK | http://memek.piwko.pl/wyklad_obiekt/przyklad4.cpp |
MeMeK | to sie nie skompiluje | |
MeMeK | dlaczego? | |
12:34 | MeMeK | class samochod |
MeMeK | { | |
MeMeK | string kolor; | |
MeMeK | string marka; | |
MeMeK | string model; | |
MeMeK | int dlugosc_mm ; //dlugosc samochodu w milimetrach | |
MeMeK | int szerokosc_mm; // szerokosc samochodu w milimetrach | |
MeMeK | int wysokosc_mm; | |
MeMeK | public: | |
MeMeK | void zmien_bieg (int na_jaki); // -1 wsteczny, 0 luz, 1 jedynka .... | |
MeMeK | void hamuj (); | |
MeMeK | void sprzeglo(); | |
MeMeK | . | |
MeMeK | . | |
MeMeK | ... itd | |
MeMeK | */ | |
MeMeK | }; | |
MeMeK | widzimy ze tylko funkcje skladowe sa publiczne | |
MeMeK | a reszta jest prywatna | |
MeMeK | dlatego nie mozemy sie dostac do skladnikow | |
12:35 | MeMeK | moj.kolor = "czerwony"; |
MeMeK | moj.marka = "audi"; | |
MeMeK | moj.model = "A6"; | |
MeMeK | to nie wypali | |
MeMeK | teraz pewnie przeklinacie ta cala enkapsulacje | |
MeMeK | ale nie | |
MeMeK | tak powinno byc | |
MeMeK | http://memek.piwko.pl/wyklad_obiekt/przyklad5.cpp | |
MeMeK | teraz zobaczmy | |
12:36 | MeMeK | string pokaz_kolor () |
MeMeK | { | |
MeMeK | return kolor; | |
MeMeK | } | |
MeMeK | pytamy sie o skladniki przez funkcje | |
MeMeK | one moga sie dostac do skladnikow private | |
MeMeK | w koncy sa czlonkami jednej klasy | |
12:37 | MeMeK | jak widac wewnatrz klasy |
MeMeK | funkcja jest od razu zdefiniowana | |
MeMeK | ale mozna tu ja tylko zadeklarowac | |
MeMeK | a zdefiniowac gdzie indziej | |
12:38 | MeMeK | http://memek.piwko.pl/wyklad_obiekt/przyklad6.cpp |
MeMeK | void samochod::ustaw (string kol, string mar, string mod) | |
MeMeK | { | |
MeMeK | kolor = kol; | |
MeMeK | marka = mar; | |
MeMeK | model = mod; | |
MeMeK | } | |
MeMeK | jak widac funkcja ustaw zostala tu zdefiniowana | |
12:39 | MeMeK | jej deklaracja jest w kalsie |
MeMeK | void ustaw (string kol, string mar, string mod); | |
12:40 | MeMeK | poza klasa definicja jest przydatna gdy funkcja jest dluga |
MeMeK | znaczy gdy ma wiecej niz 1 linijke | |
MeMeK | ;> | |
MeMeK | poza tym | |
MeMeK | gdy funkcja jest zdefiniowana wewnatrz klasy | |
12:41 | MeMeK | jest wtedy inline |
MeMeK | wiec w sam raz dla funkcji jedno linijkowych | |
MeMeK | ;> | |
MeMeK | funkcja skladowa dostaje dakze przy wywolaniu | |
MeMeK | oprocz argumentow | |
MeMeK | jeszcze wzkaznik specjalny | |
MeMeK | this | |
12:42 | MeMeK | jest to "wzkaznik" na obiekt dla ktorego aktualnie pracuje |
MeMeK | na egzemplarz obiektu | |
MeMeK | dlaczego "wzkaznik" z nie wzkaznik | |
12:43 | MeMeK | bo to nie jest taki normalny wzkaznik |
MeMeK | to jest jakby stala doslowna | |
12:44 | MeMeK | wiec nie mozna np zmienic jej adresu |
MeMeK | przesunac | |
MeMeK | or sth | |
MeMeK | jest STALY | |
MeMeK | nie do zabawy ;> | |
12:45 | MeMeK | mozemy dac klase do osobnego pliku |
MeMeK | (a raczej plikow) | |
MeMeK | 2 plikow | |
MeMeK | naglowkowego | |
MeMeK | i zrodlowego | |
12:46 | MeMeK | wtedy w naglowkowym pliku mamy tylko deklaracje klasy i jej funkcji skladowych |
MeMeK | #inndef SAMOCHOD_H | |
MeMeK | #define SAMOCHOD_H | |
MeMeK | cialo klasy*/ | |
MeMeK | #endif | |
MeMeK | tak wyglada prosty plik naglowkowy dla klasy | |
12:47 | MeMeK | te dyrektywy preprocesora sa po to aby nie includowac 2 razy jednego pliku |
MeMeK | tzw straznik naglowka | |
MeMeK | w pliku zrodlowym natomiast | |
MeMeK | dodajemy | |
MeMeK | #include "samochod.h" | |
12:48 | MeMeK | i definiujemy funkcje skladowe |
MeMeK | w przykladach bedzie zawsze w jednym pliku | |
MeMeK | zeby nie bylo zamieszania | |
MeMeK | ok | |
12:49 | MeMeK | ide po herbate ;> oglaszam 5 min przerwy |
MeMeK | na pytania | |
MeMeK | nie zdejmuje m | |
MeMeK | pytania na priv | |
MeMeK | zaraz pogadamy o konstruktorach | |
MeMeK | brb | |
13:01 | MeMeK | k lecimy dalej |
MeMeK | co to jest konstruktor... | |
MeMeK | to jest taka specjalna funkcja skladowa | |
13:02 | MeMeK | o takiej samej nazwie co klasa |
MeMeK | bez typy zwracanrgo | |
MeMeK | nie posiada ona adresu (nie mozna pokazac na nia wzkaznikiem) | |
MeMeK | jest to taki inicjalizator | |
13:03 | MeMeK | czyli robi to co trzeba zaraz po utworzeniu obiektu |
MeMeK | PO nie przed | |
MeMeK | posiada on wzkaznik this | |
13:04 | MeMeK | konstruktory nie moga byc virtual, const, static ( a tym za chwile) |
MeMeK | nie sa tez dziedziczone | |
MeMeK | powiem ze kazda klasa musi miec konsriktor tzw domyslny | |
MeMeK | czyli mozliwy do wywolania bez argumentow | |
13:05 | MeMeK | jak koder tego nie zrobi to kompilator zrobi |
13:06 | MeMeK | Nicpon podpowiada ze jesli koder zrobi jakis inny konstruktor a domniemanego nie to kompilator nie wygeneruje go |
MeMeK | prawda i nie prawda | |
MeMeK | zalezy od kompilator | |
13:07 | MeMeK | kompilatora |
MeMeK | i jego zgodnosci itp | |
MeMeK | w kazdym razie bez konstrukltora domyslnego nie mozemy robic tablic z naszych obiektow | |
MeMeK | a i przy dziedziczeniu trzeba kombinowac | |
13:08 | MeMeK | ok zaraz pokaze konstruktor |
MeMeK | ale najpierw | |
MeMeK | powiem o liscie inicjalizacyjnej | |
13:09 | MeMeK | konstruktor (arg1, arg2, arg3) : skladnik1(arg1), sklad2 (arg2), sklad3 (arg3) {} |
MeMeK | lista ta mozliwa tylko przy definicji konstruktora (o ile jest poza klasa definiowany) | |
13:10 | MeMeK | popatrzmy |
MeMeK | http://memek.piwko.pl/wyklad_obiekt/przyklad7.cpp | |
MeMeK | tam jest prosty konstruktor bez listy | |
MeMeK | a lista po prostu przypisuje od razu skladnikom wartosci podane w argumentach | |
MeMeK | ma jeszcze jedna funkcje ale pozniej powiem | |
13:11 | MeMeK | jak widac w przykladzie to nie jest konstruktor domyslny |
MeMeK | zatem trzeba go wywolac jawnie | |
MeMeK | o tak | |
MeMeK | samochod moj("czerwony", "audi", "A6"), jego("niebieski", "fiat", "126p"); | |
13:12 | MeMeK | konstruktorow moze byc kilka |
MeMeK | moga byc przeladowane | |
MeMeK | inny konstruktor to konstruktor kopiujacy | |
13:13 | MeMeK | moze on byc wywolany jawnie i niejawnie |
MeMeK | btw gdybysmy podali specyfikator explict przed deklaracja konstruktora | |
MeMeK | to oznaczaloby ze mozna go wywolac tylko jawnie | |
13:14 | MeMeK | wywolanie niejawne konstruktora kopiujacego wystepyje podczas wysylania argumentow do funkcji przez wartosc |
MeMeK | i zwracaniu przez wartosc | |
13:15 | MeMeK | jak on wyglada |
MeMeK | konstruktor (const klasa & wzor, inne_arg); | |
MeMeK | jak widac jako pierwszy argument musi posiadac referencje do obiekty swojej klasy | |
13:16 | MeMeK | moze tez miec inne argumenty |
MeMeK | ale musza miec wartosci domyslne | |
MeMeK | najlepiej jak bedzie przyjmowal ta referencje jako const | |
MeMeK | bo z reszta i tak jej nie zmieni | |
13:17 | MeMeK | w koncu on tyklo kopiuje |
MeMeK | k | |
MeMeK | dalej | |
MeMeK | jest konstruktor konwerujacy | |
MeMeK | czyli np gdy jakas tam funkcja spodziwa sie argumentu typy _nasza_KLASA_ | |
13:18 | MeMeK | a my mu podamy np inta |
MeMeK | aby to bylo mozliwe klasa musi posiadac konstruktor konwertujacy | |
MeMeK | konstruktor (TYP arg); | |
13:19 | MeMeK | taka jest jego deklaracja |
MeMeK | przyjmuje jeden argument | |
MeMeK | typu takiego z jakiego ma konwertowac na swoj typ | |
MeMeK | ok | |
MeMeK | to wiemy jak zamienic inny typ na nasz | |
13:20 | MeMeK | ale jak skonwertowac nasz typ na inny |
MeMeK | sluza do tego operatory konwersji | |
MeMeK | o tak to wyglada | |
MeMeK | klasa::operator typ() | |
MeMeK | { | |
MeMeK | /cialo | |
MeMeK | } | |
MeMeK | klasa to nazwa naszej klasy | |
MeMeK | operator to stala | |
13:21 | MeMeK | a typ to typ na jaki chcemy konwertowac nasza klase |
MeMeK | ok tyle o konstruktorach | |
MeMeK | teraz .. | |
MeMeK | destruktory | |
MeMeK | czyli specjalne funkcje wywolywane zaraz PRZED zniszczeniem obiektu | |
13:22 | MeMeK | destruktor to jest taki jakby sprzatacz |
MeMeK | czyli robi jakies rzeczy ktore powinny byc zrobione | |
MeMeK | np zwalnia pamiec ze sterty | |
MeMeK | jesli gdzies w klasie (czyt konstruktorze) zaalokowano cos operatorem new | |
13:23 | MeMeK | to on to zwalnia delete'm |
MeMeK | k teraz cos o skladnikach statycznych | |
MeMeK | czyli ze specyfikatorem static | |
MeMeK | normalnie jesli klasa ma np jeden skladnik | |
13:24 | MeMeK | a powiedzmy 100 egzemplarzy |
MeMeK | to w pamieci bedzie 100 takiech skladnikow | |
MeMeK | po 1 dla kazdego egzemplarza | |
MeMeK | ale gdyby ten skladnik byl static | |
MeMeK | to wtedy wszystkie obiekty tej klasy | |
13:25 | MeMeK | go dziela |
MeMeK | jest dla nich wspolny | |
MeMeK | deklarujemy go w ciele klasy | |
MeMeK | ale trzeba go zdefiniowac | |
MeMeK | nalepiej w pliku cpp (jesli rozbijamy na pliki) | |
13:26 | MeMeK | a jesli nie to zaraz zobaczycie |
MeMeK | typ klasa::skladnik = costam | |
MeMeK | taka jest ta jego definicja | |
MeMeK | ok popatrzmy na przyklad | |
MeMeK | http://memek.piwko.pl/wyklad_obiekt/przyklad8.cpp | |
13:27 | MeMeK | od razu pokaz na co sie przydaje destruktor |
MeMeK | acha zapomnialem powiedziec ze destruktor ma taka nazwe jak konstruktor | |
MeMeK | z wezykiem | |
MeMeK | czyli np | |
MeMeK | konstruktor | |
MeMeK | ~konstruktor (a to destruktor) | |
13:28 | MeMeK | jak widac |
MeMeK | licznik++; | |
MeMeK | w konstruktorze | |
MeMeK | inkrementujemy skladnik statyczny licznik | |
13:29 | MeMeK | samochod::~samochod () |
MeMeK | { | |
MeMeK | licznik --; | |
MeMeK | } | |
MeMeK | a w destruktorze dekrementujemy | |
MeMeK | czyli mamy prosty licznik obiektow aktualnie istniejacych w programie | |
MeMeK | moze byc jeszcze funkcja statyczna | |
MeMeK | wtedy jej wywolanie dla jakiegos obiektu | |
13:30 | MeMeK | jest rownoznaczne z wywolaniem dla wszystkich istniejacycj obiektow na raz |
MeMeK | funkcja gdy nie modyfikuje obiektu powinna byc zadeklarowana jako stala | |
MeMeK | const | |
MeMeK | dlatego zeby mogla pracowac dla obiektow const | |
13:31 | MeMeK | deklaracja takiej funkcji wyglada tak |
MeMeK | typ_zwracany nazwa (argumenty) const; | |
MeMeK | a definicja tak | |
MeMeK | typ_zwracany nazwa::klasa (argumenty) const { } | |
MeMeK | skoro jestesmyn juz przy stalosci | |
MeMeK | to jest taki specyfikator | |
13:32 | MeMeK | mutable |
MeMeK | skladnik mutable mozna zmieniac nawet w obiekcie const | |
MeMeK | taki myk ;> | |
MeMeK | ok ale czy nasza klasa jest juz jak zwykly typ | |
MeMeK | np int czy double | |
MeMeK | no niezupelnie | |
MeMeK | popatrzmy | |
13:33 | MeMeK | int a=1,b=2,c; |
MeMeK | c = a+b; | |
MeMeK | fajnie by bylo gdyby nasze obiekty tez tak sie mogly 'dodawac' | |
MeMeK | my co najwyzej mozemy zrobic tak | |
MeMeK | http://memek.piwko.pl/wyklad_obiekt/przyklad9.cpp | |
13:34 | MeMeK | mamy tam nowa prosta klase |
MeMeK | liczba_z_opisem | |
MeMeK | liczba_z_opisem a,b,c; | |
MeMeK | c = dodaj(a,b); | |
MeMeK | c.daj_glos(); | |
13:35 | MeMeK | jak widac to nie jest takie "fajne" |
MeMeK | zrobmy tak zeby + dziala dla nas ;> | |
13:36 | MeMeK | bedzie juz tak profesonalnie |
MeMeK | musimy sobie zadeklarowac operator | |
MeMeK | robi sie to tak | |
MeMeK | typ_zwracany operator# (argumenty) | |
MeMeK | { | |
MeMeK | /cialo | |
MeMeK | } | |
13:37 | MeMeK | # to nasz operator |
MeMeK | ktory chcemy zaprzac dla nas | |
MeMeK | np + | |
13:38 | MeMeK | dla nas wygladalby tak |
MeMeK | liczba_z_opisem operator+ (liczba_z_opisem); | |
MeMeK | tu mamy przyklad | |
MeMeK | http://memek.piwko.pl/wyklad_obiekt/przyklad10.cpp | |
13:39 | MeMeK | teraz widac ze mozemy go uzywac (obiektu) jak typyy wbudowane |
MeMeK | liczba_z_opisem a,b,c; | |
MeMeK | c = a+b; | |
MeMeK | operator to stala | |
MeMeK | i zawsze wystepuje | |
MeMeK | wytak wyglada jego definicja | |
MeMeK | liczba_z_opisem liczba_z_opisem::operator+ (liczba_z_opisem co) | |
MeMeK | { | |
MeMeK | liczba_z_opisem c; | |
MeMeK | c.liczba = this->liczba + co.liczba; | |
MeMeK | c.opis = "suma liczb " + this->opis + " i " + co.opis; | |
13:40 | MeMeK | return c; |
MeMeK | } | |
MeMeK | operator + jest jednoargumentowy | |
MeMeK | obiekt + inny | |
13:41 | MeMeK | wywola funkcje operatorowa "obiektu" |
MeMeK | a argumentem bedzie inny | |
MeMeK | dlatego uzywalem this | |
MeMeK | mozna rownie dobrze wykorzystac operator - | |
13:42 | MeMeK | jak i inne |
MeMeK | ok | |
MeMeK | teraz pogadamy o przyjazni | |
MeMeK | nasza klasa moze sie kolegowac z jakas funkcja nie-skladowa | |
MeMeK | friend typ_zwracany nazwa (arg); | |
MeMeK | taka jest deklaracja przyjazni | |
13:43 | MeMeK | moze to byc od razu deklaracja samej funkcji |
MeMeK | taka funkcja zaprzyjazniona | |
MeMeK | nie jest funkcja skadowa klasy | |
MeMeK | nie dostaje this'a | |
13:44 | MeMeK | ma za to dostep do jej skladnikow |
MeMeK | tak jakby byly wszystkie publiczne dla niej | |
MeMeK | nawet tych private | |
MeMeK | mozemy sie takze zakolegowac z funkcja skladowa innej klasy | |
MeMeK | friend typ_zwracany klasa::funkcja (arg); | |
13:45 | MeMeK | albo od razu z cala inna klasa |
MeMeK | friend class nazwa_klasy; | |
MeMeK | teraz kilka regul przyjazni wedlug c++ ;> | |
MeMeK | regula 1 | |
MeMeK | przyjazn nie jest wzajemna - "nie jestem przyjacielem swojego przyjaciela" | |
13:46 | MeMeK | regula 2 |
MeMeK | nie jest przechodnia - "przyjaciel mojego przyjaciela nie jest moim przyjacielem" | |
MeMeK | regula 3 | |
MeMeK | nie jest dziedziczna - "przyjaciel mojej mamy ani dziecka mego nie jest moim przyjacielem" | |
MeMeK | ;> | |
13:47 | MeMeK | k teraz dziedzicznie |
MeMeK | jasli chcemy miec inna klase podobna do naszej | |
MeMeK | alew z drobnymi poprawkami | |
MeMeK | to nie musimy robic od nowa innej | |
MeMeK | mozemy zrobic klase-dziecko | |
MeMeK | dla naszej | |
13:48 | MeMeK | klasa taka dziedziczy po klasie macierzystej |
MeMeK | wszystkie skladniki i funkcje skladowe | |
MeMeK | oczywiscie | |
MeMeK | jest haczyk | |
MeMeK | wczystkie oprocz private | |
MeMeK | class dziecko : public matka | |
MeMeK | { | |
MeMeK | / | |
MeMeK | } | |
13:49 | MeMeK | co oznacza to public w 1 linijce |
MeMeK | ano oznacza ni mniej nie wiecej jak to | |
MeMeK | ze dziedziczymy wszystko tak jak u mamusi ;> | |
13:50 | MeMeK | czyli co w klasie macierzystej jest public jest dziedziczone jako public |
MeMeK | a co jest protected dziedziczymy jko protected | |
MeMeK | przyklad | |
MeMeK | http://memek.piwko.pl/wyklad_obiekt/przyklad11.cpp | |
13:51 | MeMeK | chcemy miec szczegolny przypadek figury |
MeMeK | czyli kwadrat | |
MeMeK | nie za bardzo nam sie usmiecha takie cos jak na przykladzie | |
MeMeK | http://memek.piwko.pl/wyklad_obiekt/przyklad12.cpp | |
MeMeK | ale tak juz lepiej | |
13:52 | MeMeK | widzimy ze klasa kwadrat jest pochodna od klasy figura2D |
MeMeK | dziedziczy po niej skladnikio | |
MeMeK | a dodatkowo ma jeden dodany | |
MeMeK | dlugosc boku | |
MeMeK | bo przeciez jakas tam figura nie wie jaka ma dlugosc boku | |
MeMeK | a kwadrat wie ;> | |
13:53 | MeMeK | ok czego ona nie odziedziczyla |
MeMeK | otoz nie dziedziczy sie | |
MeMeK | konstroktorow, destruktora i operatora = | |
MeMeK | kwadrat::kwadrat (string a = "cos", string b = "jakis", int c=1): figura2D() | |
13:54 | MeMeK | widzimy jeszcze jedna funkcje listy inicjalizacyjnej |
MeMeK | wywolujemy z niej konstruktor klasy podstawowej | |
MeMeK | nie trzeba wywolywac go w liscie jesli klasa podst nie ma konstruktora | |
MeMeK | albo ma domniemany, wiec tu nie | |
MeMeK | musialem | |
13:55 | MeMeK | ok w jakiej kolejnosci sa wywolywane konstruktory |
MeMeK | otoz kazda klasa napierw wywoluje konstruktor swojej matki | |
MeMeK | wiec najpierw starsi | |
MeMeK | potem dzieci | |
13:56 | MeMeK | http://memek.piwko.pl/wyklad_obiekt/przyklad13.cpp |
MeMeK | widzimy ze tutaj konstruktory matki i dziecka krzycza gdy sa wywolane | |
MeMeK | K podst | |
MeMeK | K podst | |
MeMeK | K dziecka | |
MeMeK | Jestem cos koloru: jakis | |
MeMeK | Jestem kwadrat koloru: czarny | |
MeMeK | Press ENTER to continue. | |
13:57 | MeMeK | widzimy ze faktycznie najpierw sa wywalywane konstruktory starszych |
MeMeK | pierwszy wypis K podst jest wywolany przrz | |
MeMeK | figura2D figura; | |
MeMeK | sami stworzylismy obiekt klasy podstawowej | |
MeMeK | a to | |
13:58 | MeMeK | kwadrat moj_kwadrat("kwadrat", "czarny"); |
MeMeK | odpowiada tym wypisom | |
MeMeK | K podst | |
MeMeK | ||
MeMeK | K dziecka | |
13:59 | MeMeK | ok tearz mamy prosta droge do wirtualnosci i polimorfizmu ;> |
MeMeK | popatrzmy na to | |
MeMeK | http://memek.piwko.pl/wyklad_obiekt/przyklad14.cpp | |
MeMeK | K podst | |
MeMeK | K podst | |
MeMeK | K dziecka | |
MeMeK | Jestem cos koloru: jakis | |
MeMeK | Jestem kwadrat koloru: czarny | |
MeMeK | mam x bokow | |
MeMeK | mam 4 boki | |
MeMeK | Press ENTER to continue. | |
14:00 | MeMeK | niby dziala jak trzeba |
MeMeK | i tak jest w istocie | |
MeMeK | ale | |
MeMeK | http://memek.piwko.pl/wyklad_obiekt/przyklad15.cpp | |
MeMeK | K podst | |
MeMeK | K podst | |
MeMeK | K dziecka | |
MeMeK | Jestem cos koloru: jakis | |
MeMeK | Jestem kwadrat koloru: czarny | |
MeMeK | mam x bokow | |
MeMeK | mam 4 boki | |
MeMeK | mam x bokow | |
MeMeK | Press ENTER to continue. | |
MeMeK | co jest do licha? | |
MeMeK | przeciez mamy wyraznie | |
14:01 | MeMeK | figura2D * p_inny; |
MeMeK | p_inny = p_kwadrat; | |
MeMeK | p_inny->ile_bokow(); | |
MeMeK | wzkaznik p_inny pokazuje na obiekt kwadrat | |
MeMeK | wiec dalczego mowi ze ma x bokow | |
MeMeK | jak ma 4 | |
MeMeK | hmm | |
MeMeK | w sumie to to jest dobrze | |
14:02 | MeMeK | kompilator pomyslal maszynowo |
MeMeK | w koncu wzkaznik | |
MeMeK | p_inny | |
MeMeK | jest wzkaznikiem to pokazywania na obiekty typy figura2D | |
MeMeK | kompilator olal to ze aktualnie pokazuje na obiekt klasy kwadrat | |
14:03 | MeMeK | i wywolal funkcje skladowa ile_bokow() jak dla obiektu typu figura2D |
MeMeK | to dla nas zle | |
14:04 | MeMeK | to dlatego ze tutaj jest wczesne wiazanie |
MeMeK | czyli juz na etapie kompilaci wiadomo jaka funkcje wywolac | |
MeMeK | a jednak wiadomo zle | |
14:05 | MeMeK | http://memek.piwko.pl/wyklad_obiekt/przyklad16.cpp |
MeMeK | spojrzmy | |
MeMeK | K podst | |
MeMeK | K podst | |
MeMeK | K dziecka | |
MeMeK | Jestem cos koloru: jakis | |
MeMeK | Jestem kwadrat koloru: czarny | |
MeMeK | mam x bokow | |
MeMeK | mam 4 boki | |
MeMeK | mam 4 boki | |
MeMeK | Press ENTER to continue. | |
14:06 | MeMeK | no teraz jest tak jak powinno byc |
MeMeK | olalismy typ wzkaznika tylko patrzymy na to na co pokazuje | |
MeMeK | to sie fachowo nazywa polimorfizmem | |
MeMeK | class figura2D | |
MeMeK | { | |
MeMeK | public: | |
MeMeK | string opis, kolor; | |
MeMeK | figura2D (string a = "cos", string b = "jakis") : opis(a), kolor(b) {cout<<"K podst"<<endl;} | |
MeMeK | void daj_glos (); | |
MeMeK | virtual void ile_bokow() {cout <<"mam x bokow"<<endl;} | |
MeMeK | }; | |
MeMeK | pojawilo sie cos nowego | |
MeMeK | slowko "virtual" | |
14:07 | MeMeK | oznacza ono ze ta funkcja (ile_bokow()) jest wirtualna |
MeMeK | czyli na pewno bedzie zastapiano swoaja lepsza wersja u dzieci | |
MeMeK | virtual moga byc TYLKO funkcje skladowe | |
MeMeK | nie przyjaciele | |
14:08 | MeMeK | teraz mamy do czynienia z tzw poznym wizaniem |
MeMeK | czyli dopiero na etapie uruchamiania wiadomo na co pokazuje wzkaznik | |
MeMeK | i jest wywolywana odpowiednia funkcja | |
14:09 | MeMeK | podobnie jesli mamy funkcje ktora jako argument wola obiekt klasy macierzystej |
MeMeK | a my jej podamy obiekt klasy-dzecka | |
14:10 | MeMeK | rowniez jesli wewnatrz tej funkcji zostana wywolane jakies metody pierwotnie zakladane jako metody klasy podstawowej |
MeMeK | to i tak uruchomione zostano funkcje skladowe klasy-dziecka | |
14:11 | MeMeK | czyli pomijamy typ wzkaznika |
MeMeK | lub referencji (jesli jej uzywamy) | |
MeMeK | a patzrymy na to na co pokazuje TERAZ wzkaznik | |
14:12 | MeMeK | to otwiera nowe horyzonty |
MeMeK | mozemy tworzyc klasy abstrakcyjne | |
MeMeK | np nasza figura2D jest klasa abstrakcyjna | |
MeMeK | bo przeciez nie mozemy narysowac na papierze "figury" | |
MeMeK | zawsze bedzie to jakis specjalny przypadek tej figury | |
14:13 | MeMeK | jakis kwadrat, kolo |
MeMeK | klasa abstrakcyjna zawiera funkcje wirtualne | |
14:14 | MeMeK | takie funkcje ktore istnieja tylko po to aby zostale zamienione na lepsze u dzieci |
MeMeK | ;> | |
MeMeK | sa to wtedy tzw funkcje czysto wirtualne | |
14:15 | MeMeK | wyobrazmy sobie ze jakis tam pra wnuczek naszej klasy nie definiuje wlasnego odpowiednika funkcji wirtualnej |
MeMeK | jednak mimo to jego potomkowie i tak odziedzicza ja | |
MeMeK | teraz po co to stosowc | |
14:16 | MeMeK | po raz. dla wygody (notabene z lenistwa) ;> |
MeMeK | po dwa jest tak szybciej | |
MeMeK | po 3. bo tak ;> | |
14:17 | MeMeK | jest to chyba najfajniejsza rzecz w programowaniu obiektowym ;> |
MeMeK | no i to by bylo na dzisiaj tyle | |
MeMeK | zapraszam jutro | |
MeMeK | na mo kolejny wyklad | |
MeMeK | traktujacy o szablonach i sytuacjach wyjatkowych | |
14:18 | MeMeK | przypominam ze ten wyklad mozna komentowac |
MeMeK | http://forum.wyklady.net/index.php?topic=74.0 | |
MeMeK | o tutaj | |
MeMeK | no to dzieki za uwage | |
MeMeK | pa |