12:00Temat wykladu:
C++: Obiektowość dla zaawansowanych (by MeMeK, 16.08.06) @ wyklady.net
12:08MeMeKwitam was na dzisiejszym wykladzie
MeMeKbedzie on traktowal o technice oop
MeMeKobiect oriented programming
12:09MeMeKprzypominam ze wyklad berdzie mozna komentowac po jego zakonczeniu
MeMeKhttp://forum.wyklady.net/index.php?topic=74.0
MeMeKo tu
MeMeKo czym bedzie juz powiedzialem
MeMeKpowiemy o budowie klas
MeMeKpo co je stosowac
12:10MeMeKi roznych rzeczach jak konstruktory itp
MeMeKoczywiscie nie zabraknie polimorfizmu
MeMeKwiec k lecimy
MeMeKkiedy piszemy program
MeMeKmozemy bardzo latwo stworzyc sobie
12:11MeMeKnp jakis napis czy liczbe
MeMeKwystarczy do tego krotka deklaracja
MeMeKint zmienna;
MeMeKale to so tylko proste rzeczy
MeMeKliczba
12:12MeMeKnie daje za duzo mozliwosci
MeMeKwyobrazmy sobie ze chcemy zaimplementowac samochod
MeMeKhttp://memek.piwko.pl/wyklad_obiekt/przyklad1.cpp
MeMeKzerknijcie
12:13MeMeKmamy tam bardzo prosta lapotologiczna definiecje jakiegos samochodu
MeMeKstring kolor = "czerwony";
MeMeKstring marka = "audi";
MeMeKstring model = "A6";
MeMeKint dlugosc_mm = 4523; //dlugosc samochodu w milimetrach
MeMeKint szerokosc_mm = 1607 // szerokosc samochodu w milimetrach
MeMeKint wysokosc_mm = 1458;
MeMeK.
MeMeK.
MeMeK.
MeMeK(...)
MeMeK*/
MeMeKvoid zmien_bieg (int na_jaki); // -1 wsteczny, 0 luz, 1 jedynka ....
MeMeKvoid hamuj ();
MeMeKvoid sprzeglo();
MeMeKno fajnie
MeMeKale teraz np
MeMeKwybrazmy sobie ze robimy gre
12:14MeMeKwyscigowke tak zwana
MeMeKi potrzebujemy 50 samochodow
MeMeKczy jestesmy zmuszeni do przepisywania tego skrawka kodu 50 razy
12:15MeMeKile z tym klopotu
MeMeKprzeciez nazwy beda musialy byc w kazdym inne
MeMeKoczywiscie mozemy zrobic osobne przestrzenie nazw
MeMeKdla kazdego auta
MeMeKale po co
MeMeKczy nie mozna tego zrobic raz
12:16MeMeKi potem uzywac wielokrotnie
MeMeKjak np typ
MeMeKinteger
MeMeKokazuje sie ze mozna
MeMeKstworzymy swoj wlasny typ
MeMeKi bedzie mozna z nim postepowac (prawie) tak jak z typami wbudowanymi
12:17MeMeKale jak to zrobic?
MeMeKano zbudujmy klase ;>
MeMeKoto jej prosta budowa
MeMeKclass nazwa_klasy
MeMeK{
MeMeK/wnetrze
MeMeK}; //pamietajmy o sredniku
MeMeKclass nazwa_klasy
MeMeK{
MeMeK/wnetrze
MeMeK}; //pamietajmy o sredniku
12:18MeMeKok teraz wystarczy wrzucic nasze "czesci" samochodu do srodka
MeMeKi mamy fabryke aut ;>
MeMeKfajnie
MeMeKale co mozemy wrzucic do srodka
MeMeKw zasadzie ogolnie mowiac moga to byc 2 rzeczy
MeMeKjakas dana skladowa
12:19MeMeKnp lancuch znakow
MeMeKa takze mozna wrzucic tam funkcje
MeMeKtzw funkcja skladowa
MeMeKzwana takze metoda
12:20MeMeKok to robimy klase "samochod"
MeMeKhttp://memek.piwko.pl/wyklad_obiekt/przyklad2.cpp
dragonre
MeMeKi teraz jak latwo storzyc nowy egzemlarz autka
MeMeKsamochod moj;
MeMeKzupelnie jak typy wbudowane
12:21MeMeKa o to nam przeciez chodzilo ;>
MeMeKjak widac mozemy dostac sie do skladnika klasy
MeMeKza pomoca kropki
MeMeK.
MeMeKmoj.kolor = "czerwony";
12:22MeMeKgdybysmy mieli wskaznik na typ samochod i ustawili go na obiekt "moj"
MeMeKdostanie sie do skladnika wygladaloby mniej wiecej tak
MeMeKp_moj->kolor = "czerwony";
12:23MeMeKczyli przez wzkaznik robimy to za pomoca strzalki
MeMeK->
MeMeKhttp://memek.piwko.pl/wyklad_obiekt/przyklad3.cpp
12:24MeMeKmozna zrobic za jednym zamachem kilka aut
MeMeKsamochod moj, twoj, jego, jej, mamy, taty, wujka;
MeMeK<Robo>l p_moj->kolor = "czerwony"; to jest to samo co *p_moj.kolor = "czerwony"; ?
12:25MeMeKodpowiedz brzmi nie
MeMeKza pomoca * przy wzkazniku
MeMeKdostajemy sie do pamieci wzkaznika
MeMeKjego zawartosci
MeMeKa jego zawartoscia jest adres
MeMeKa my chcemy dostac sie do tego na co pokazuje
MeMeKwiec bez gwiazdki
12:26MeMeKok
MeMeKclass samochod
MeMeK{
MeMeKpublic:
MeMeKco to jest to public:
MeMeKto jest taka specjalna etykieta wewnatrz klasy
12:27MeMeKktora mowi nam o wlasciwosciach skladnikow
MeMeKpod nia
MeMeKmoga byc 3 rozne etykiety dostepu
MeMeKpublic
MeMeKczyli dostepne dla wszystkich
MeMeKto znaczy ze do skladnika klasy moze sie dostac kazdy
12:28MeMeKprotected
MeMeKczyli dla siebie i rodzinki (o dziedziczeniu pozniej)
MeMeKno i dla kolegow (tez o tym pozniej)
12:29MeMeKprivate]
MeMeKczyli tylko dla siebie
MeMeK(i kolegow)
MeMeKpowiem jeszcze ze private jest domyslne
MeMeKczyli jak nie podamy zadnej etykiety to wszystko bedzie provate
12:30MeMeK*private
MeMeKale po co tak ukrywac skladniki klasy???
MeMeKjest kilka powodow
MeMeKbtw. takie ukrywanie nazywa sie fachowo
MeMeKenkapsulacja
MeMeKalbo h
MeMeKhermetyzacja
12:31MeMeKrobi sie to dlatego ze nie wszystko powinno byc dostepne
MeMeKnp nasza klasa samochod
MeMeKma funkce skladowa hamuj()
12:32MeMeKale przeciez hamuj() musi wywolac inne funkcje skladowe
MeMeKnp
MeMeKzacisnij_klocki()
MeMeKnapnij_pasy
MeMeKwyprostuj_siedzenia
MeMeKa przeciez normalnie nie mozemy np zacisnac klocko
MeMeKnie ma takiego samochodu ;>
MeMeKok
12:33MeMeKhttp://memek.piwko.pl/wyklad_obiekt/przyklad4.cpp
MeMeKto sie nie skompiluje
MeMeKdlaczego?
12:34MeMeKclass samochod
MeMeK{
MeMeKstring kolor;
MeMeKstring marka;
MeMeKstring model;
MeMeKint dlugosc_mm ; //dlugosc samochodu w milimetrach
MeMeKint szerokosc_mm; // szerokosc samochodu w milimetrach
MeMeKint wysokosc_mm;
MeMeKpublic:
MeMeKvoid zmien_bieg (int na_jaki); // -1 wsteczny, 0 luz, 1 jedynka ....
MeMeKvoid hamuj ();
MeMeKvoid sprzeglo();
MeMeK.
MeMeK.
MeMeK... itd
MeMeK*/
MeMeK};
MeMeKwidzimy ze tylko funkcje skladowe sa publiczne
MeMeKa reszta jest prywatna
MeMeKdlatego nie mozemy sie dostac do skladnikow
12:35MeMeKmoj.kolor = "czerwony";
MeMeKmoj.marka = "audi";
MeMeKmoj.model = "A6";
MeMeKto nie wypali
MeMeKteraz pewnie przeklinacie ta cala enkapsulacje
MeMeKale nie
MeMeKtak powinno byc
MeMeKhttp://memek.piwko.pl/wyklad_obiekt/przyklad5.cpp
MeMeKteraz zobaczmy
12:36MeMeKstring pokaz_kolor ()
MeMeK{
MeMeKreturn kolor;
MeMeK}
MeMeKpytamy sie o skladniki przez funkcje
MeMeKone moga sie dostac do skladnikow private
MeMeKw koncy sa czlonkami jednej klasy
12:37MeMeKjak widac wewnatrz klasy
MeMeKfunkcja jest od razu zdefiniowana
MeMeKale mozna tu ja tylko zadeklarowac
MeMeKa zdefiniowac gdzie indziej
12:38MeMeKhttp://memek.piwko.pl/wyklad_obiekt/przyklad6.cpp
MeMeKvoid samochod::ustaw (string kol, string mar, string mod)
MeMeK{
MeMeKkolor = kol;
MeMeKmarka = mar;
MeMeKmodel = mod;
MeMeK}
MeMeKjak widac funkcja ustaw zostala tu zdefiniowana
12:39MeMeKjej deklaracja jest w kalsie
MeMeKvoid ustaw (string kol, string mar, string mod);
12:40MeMeKpoza klasa definicja jest przydatna gdy funkcja jest dluga
MeMeKznaczy gdy ma wiecej niz 1 linijke
MeMeK;>
MeMeKpoza tym
MeMeKgdy funkcja jest zdefiniowana wewnatrz klasy
12:41MeMeKjest wtedy inline
MeMeKwiec w sam raz dla funkcji jedno linijkowych
MeMeK;>
MeMeKfunkcja skladowa dostaje dakze przy wywolaniu
MeMeKoprocz argumentow
MeMeKjeszcze wzkaznik specjalny
MeMeKthis
12:42MeMeKjest to "wzkaznik" na obiekt dla ktorego aktualnie pracuje
MeMeKna egzemplarz obiektu
MeMeKdlaczego "wzkaznik" z nie wzkaznik
12:43MeMeKbo to nie jest taki normalny wzkaznik
MeMeKto jest jakby stala doslowna
12:44MeMeKwiec nie mozna np zmienic jej adresu
MeMeKprzesunac
MeMeKor sth
MeMeKjest STALY
MeMeKnie do zabawy ;>
12:45MeMeKmozemy dac klase do osobnego pliku
MeMeK(a raczej plikow)
MeMeK2 plikow
MeMeKnaglowkowego
MeMeKi zrodlowego
12:46MeMeKwtedy w naglowkowym pliku mamy tylko deklaracje klasy i jej funkcji skladowych
MeMeK#inndef SAMOCHOD_H
MeMeK#define SAMOCHOD_H
MeMeKcialo klasy*/
MeMeK#endif
MeMeKtak wyglada prosty plik naglowkowy dla klasy
12:47MeMeKte dyrektywy preprocesora sa po to aby nie includowac 2 razy jednego pliku
MeMeKtzw straznik naglowka
MeMeKw pliku zrodlowym natomiast
MeMeKdodajemy
MeMeK#include "samochod.h"
12:48MeMeKi definiujemy funkcje skladowe
MeMeKw przykladach bedzie zawsze w jednym pliku
MeMeKzeby nie bylo zamieszania
MeMeKok
12:49MeMeKide po herbate ;> oglaszam 5 min przerwy
MeMeKna pytania
MeMeKnie zdejmuje m
MeMeKpytania na priv
MeMeKzaraz pogadamy o konstruktorach
MeMeKbrb
13:01MeMeKk lecimy dalej
MeMeKco to jest konstruktor...
MeMeKto jest taka specjalna funkcja skladowa
13:02MeMeKo takiej samej nazwie co klasa
MeMeKbez typy zwracanrgo
MeMeKnie posiada ona adresu (nie mozna pokazac na nia wzkaznikiem)
MeMeKjest to taki inicjalizator
13:03MeMeKczyli robi to co trzeba zaraz po utworzeniu obiektu
MeMeKPO nie przed
MeMeKposiada on wzkaznik this
13:04MeMeKkonstruktory nie moga byc virtual, const, static ( a tym za chwile)
MeMeKnie sa tez dziedziczone
MeMeKpowiem ze kazda klasa musi miec konsriktor tzw domyslny
MeMeKczyli mozliwy do wywolania bez argumentow
13:05MeMeKjak koder tego nie zrobi to kompilator zrobi
13:06MeMeKNicpon podpowiada ze jesli koder zrobi jakis inny konstruktor a domniemanego nie to kompilator nie wygeneruje go
MeMeKprawda i nie prawda
MeMeKzalezy od kompilator
13:07MeMeKkompilatora
MeMeKi jego zgodnosci itp
MeMeKw kazdym razie bez konstrukltora domyslnego nie mozemy robic tablic z naszych obiektow
MeMeKa i przy dziedziczeniu trzeba kombinowac
13:08MeMeKok zaraz pokaze konstruktor
MeMeKale najpierw
MeMeKpowiem o liscie inicjalizacyjnej
13:09MeMeKkonstruktor (arg1, arg2, arg3) : skladnik1(arg1), sklad2 (arg2), sklad3 (arg3) {}
MeMeKlista ta mozliwa tylko przy definicji konstruktora (o ile jest poza klasa definiowany)
13:10MeMeKpopatrzmy
MeMeKhttp://memek.piwko.pl/wyklad_obiekt/przyklad7.cpp
MeMeKtam jest prosty konstruktor bez listy
MeMeKa lista po prostu przypisuje od razu skladnikom wartosci podane w argumentach
MeMeKma jeszcze jedna funkcje ale pozniej powiem
13:11MeMeKjak widac w przykladzie to nie jest konstruktor domyslny
MeMeKzatem trzeba go wywolac jawnie
MeMeKo tak
MeMeKsamochod moj("czerwony", "audi", "A6"), jego("niebieski", "fiat", "126p");
13:12MeMeKkonstruktorow moze byc kilka
MeMeKmoga byc przeladowane
MeMeKinny konstruktor to konstruktor kopiujacy
13:13MeMeKmoze on byc wywolany jawnie i niejawnie
MeMeKbtw gdybysmy podali specyfikator explict przed deklaracja konstruktora
MeMeKto oznaczaloby ze mozna go wywolac tylko jawnie
13:14MeMeKwywolanie niejawne konstruktora kopiujacego wystepyje podczas wysylania argumentow do funkcji przez wartosc
MeMeKi zwracaniu przez wartosc
13:15MeMeKjak on wyglada
MeMeKkonstruktor (const klasa & wzor, inne_arg);
MeMeKjak widac jako pierwszy argument musi posiadac referencje do obiekty swojej klasy
13:16MeMeKmoze tez miec inne argumenty
MeMeKale musza miec wartosci domyslne
MeMeKnajlepiej jak bedzie przyjmowal ta referencje jako const
MeMeKbo z reszta i tak jej nie zmieni
13:17MeMeKw koncu on tyklo kopiuje
MeMeKk
MeMeKdalej
MeMeKjest konstruktor konwerujacy
MeMeKczyli np gdy jakas tam funkcja spodziwa sie argumentu typy _nasza_KLASA_
13:18MeMeKa my mu podamy np inta
MeMeKaby to bylo mozliwe klasa musi posiadac konstruktor konwertujacy
MeMeKkonstruktor (TYP arg);
13:19MeMeKtaka jest jego deklaracja
MeMeKprzyjmuje jeden argument
MeMeKtypu takiego z jakiego ma konwertowac na swoj typ
MeMeKok
MeMeKto wiemy jak zamienic inny typ na nasz
13:20MeMeKale jak skonwertowac nasz typ na inny
MeMeKsluza do tego operatory konwersji
MeMeKo tak to wyglada
MeMeKklasa::operator typ()
MeMeK{
MeMeK/cialo
MeMeK}
MeMeKklasa to nazwa naszej klasy
MeMeKoperator to stala
13:21MeMeKa typ to typ na jaki chcemy konwertowac nasza klase
MeMeKok tyle o konstruktorach
MeMeKteraz ..
MeMeKdestruktory
MeMeKczyli specjalne funkcje wywolywane zaraz PRZED zniszczeniem obiektu
13:22MeMeKdestruktor to jest taki jakby sprzatacz
MeMeKczyli robi jakies rzeczy ktore powinny byc zrobione
MeMeKnp zwalnia pamiec ze sterty
MeMeKjesli gdzies w klasie (czyt konstruktorze) zaalokowano cos operatorem new
13:23MeMeKto on to zwalnia delete'm
MeMeKk teraz cos o skladnikach statycznych
MeMeKczyli ze specyfikatorem static
MeMeKnormalnie jesli klasa ma np jeden skladnik
13:24MeMeKa powiedzmy 100 egzemplarzy
MeMeKto w pamieci bedzie 100 takiech skladnikow
MeMeKpo 1 dla kazdego egzemplarza
MeMeKale gdyby ten skladnik byl static
MeMeKto wtedy wszystkie obiekty tej klasy
13:25MeMeKgo dziela
MeMeKjest dla nich wspolny
MeMeKdeklarujemy go w ciele klasy
MeMeKale trzeba go zdefiniowac
MeMeKnalepiej w pliku cpp (jesli rozbijamy na pliki)
13:26MeMeKa jesli nie to zaraz zobaczycie
MeMeKtyp klasa::skladnik = costam
MeMeKtaka jest ta jego definicja
MeMeKok popatrzmy na przyklad
MeMeKhttp://memek.piwko.pl/wyklad_obiekt/przyklad8.cpp
13:27MeMeKod razu pokaz na co sie przydaje destruktor
MeMeKacha zapomnialem powiedziec ze destruktor ma taka nazwe jak konstruktor
MeMeKz wezykiem
MeMeKczyli np
MeMeKkonstruktor
MeMeK~konstruktor (a to destruktor)
13:28MeMeKjak widac
MeMeKlicznik++;
MeMeKw konstruktorze
MeMeKinkrementujemy skladnik statyczny licznik
13:29MeMeKsamochod::~samochod ()
MeMeK{
MeMeKlicznik --;
MeMeK}
MeMeKa w destruktorze dekrementujemy
MeMeKczyli mamy prosty licznik obiektow aktualnie istniejacych w programie
MeMeKmoze byc jeszcze funkcja statyczna
MeMeKwtedy jej wywolanie dla jakiegos obiektu
13:30MeMeKjest rownoznaczne z wywolaniem dla wszystkich istniejacycj obiektow na raz
MeMeKfunkcja gdy nie modyfikuje obiektu powinna byc zadeklarowana jako stala
MeMeKconst
MeMeKdlatego zeby mogla pracowac dla obiektow const
13:31MeMeKdeklaracja takiej funkcji wyglada tak
MeMeKtyp_zwracany nazwa (argumenty) const;
MeMeKa definicja tak
MeMeKtyp_zwracany nazwa::klasa (argumenty) const { }
MeMeKskoro jestesmyn juz przy stalosci
MeMeKto jest taki specyfikator
13:32MeMeKmutable
MeMeKskladnik mutable mozna zmieniac nawet w obiekcie const
MeMeKtaki myk ;>
MeMeKok ale czy nasza klasa jest juz jak zwykly typ
MeMeKnp int czy double
MeMeKno niezupelnie
MeMeKpopatrzmy
13:33MeMeKint a=1,b=2,c;
MeMeKc = a+b;
MeMeKfajnie by bylo gdyby nasze obiekty tez tak sie mogly 'dodawac'
MeMeKmy co najwyzej mozemy zrobic tak
MeMeKhttp://memek.piwko.pl/wyklad_obiekt/przyklad9.cpp
13:34MeMeKmamy tam nowa prosta klase
MeMeKliczba_z_opisem
MeMeKliczba_z_opisem a,b,c;
MeMeKc = dodaj(a,b);
MeMeKc.daj_glos();
13:35MeMeKjak widac to nie jest takie "fajne"
MeMeKzrobmy tak zeby + dziala dla nas ;>
13:36MeMeKbedzie juz tak profesonalnie
MeMeKmusimy sobie zadeklarowac operator
MeMeKrobi sie to tak
MeMeKtyp_zwracany operator# (argumenty)
MeMeK{
MeMeK/cialo
MeMeK}
13:37MeMeK# to nasz operator
MeMeKktory chcemy zaprzac dla nas
MeMeKnp +
13:38MeMeKdla nas wygladalby tak
MeMeKliczba_z_opisem operator+ (liczba_z_opisem);
MeMeKtu mamy przyklad
MeMeKhttp://memek.piwko.pl/wyklad_obiekt/przyklad10.cpp
13:39MeMeKteraz widac ze mozemy go uzywac (obiektu) jak typyy wbudowane
MeMeKliczba_z_opisem a,b,c;
MeMeKc = a+b;
MeMeKoperator to stala
MeMeKi zawsze wystepuje
MeMeKwytak wyglada jego definicja
MeMeKliczba_z_opisem liczba_z_opisem::operator+ (liczba_z_opisem co)
MeMeK{
MeMeKliczba_z_opisem c;
MeMeKc.liczba = this->liczba + co.liczba;
MeMeKc.opis = "suma liczb " + this->opis + " i " + co.opis;
13:40MeMeKreturn c;
MeMeK}
MeMeKoperator + jest jednoargumentowy
MeMeKobiekt + inny
13:41MeMeKwywola funkcje operatorowa "obiektu"
MeMeKa argumentem bedzie inny
MeMeKdlatego uzywalem this
MeMeKmozna rownie dobrze wykorzystac operator -
13:42MeMeKjak i inne
MeMeKok
MeMeKteraz pogadamy o przyjazni
MeMeKnasza klasa moze sie kolegowac z jakas funkcja nie-skladowa
MeMeKfriend typ_zwracany nazwa (arg);
MeMeKtaka jest deklaracja przyjazni
13:43MeMeKmoze to byc od razu deklaracja samej funkcji
MeMeKtaka funkcja zaprzyjazniona
MeMeKnie jest funkcja skadowa klasy
MeMeKnie dostaje this'a
13:44MeMeKma za to dostep do jej skladnikow
MeMeKtak jakby byly wszystkie publiczne dla niej
MeMeKnawet tych private
MeMeKmozemy sie takze zakolegowac z funkcja skladowa innej klasy
MeMeKfriend typ_zwracany klasa::funkcja (arg);
13:45MeMeKalbo od razu z cala inna klasa
MeMeKfriend class nazwa_klasy;
MeMeKteraz kilka regul przyjazni wedlug c++ ;>
MeMeKregula 1
MeMeKprzyjazn nie jest wzajemna - "nie jestem przyjacielem swojego przyjaciela"
13:46MeMeKregula 2
MeMeKnie jest przechodnia - "przyjaciel mojego przyjaciela nie jest moim przyjacielem"
MeMeKregula 3
MeMeKnie jest dziedziczna - "przyjaciel mojej mamy ani dziecka mego nie jest moim przyjacielem"
MeMeK;>
13:47MeMeKk teraz dziedzicznie
MeMeKjasli chcemy miec inna klase podobna do naszej
MeMeKalew z drobnymi poprawkami
MeMeKto nie musimy robic od nowa innej
MeMeKmozemy zrobic klase-dziecko
MeMeKdla naszej
13:48MeMeKklasa taka dziedziczy po klasie macierzystej
MeMeKwszystkie skladniki i funkcje skladowe
MeMeKoczywiscie
MeMeKjest haczyk
MeMeKwczystkie oprocz private
MeMeKclass dziecko : public matka
MeMeK{
MeMeK/
MeMeK}
13:49MeMeKco oznacza to public w 1 linijce
MeMeKano oznacza ni mniej nie wiecej jak to
MeMeKze dziedziczymy wszystko tak jak u mamusi ;>
13:50MeMeKczyli co w klasie macierzystej jest public jest dziedziczone jako public
MeMeKa co jest protected dziedziczymy jko protected
MeMeKprzyklad
MeMeKhttp://memek.piwko.pl/wyklad_obiekt/przyklad11.cpp
13:51MeMeKchcemy miec szczegolny przypadek figury
MeMeKczyli kwadrat
MeMeKnie za bardzo nam sie usmiecha takie cos jak na przykladzie
MeMeKhttp://memek.piwko.pl/wyklad_obiekt/przyklad12.cpp
MeMeKale tak juz lepiej
13:52MeMeKwidzimy ze klasa kwadrat jest pochodna od klasy figura2D
MeMeKdziedziczy po niej skladnikio
MeMeKa dodatkowo ma jeden dodany
MeMeKdlugosc boku
MeMeKbo przeciez jakas tam figura nie wie jaka ma dlugosc boku
MeMeKa kwadrat wie ;>
13:53MeMeKok czego ona nie odziedziczyla
MeMeKotoz nie dziedziczy sie
MeMeKkonstroktorow, destruktora i operatora =
MeMeKkwadrat::kwadrat (string a = "cos", string b = "jakis", int c=1): figura2D()
13:54MeMeKwidzimy jeszcze jedna funkcje listy inicjalizacyjnej
MeMeKwywolujemy z niej konstruktor klasy podstawowej
MeMeKnie trzeba wywolywac go w liscie jesli klasa podst nie ma konstruktora
MeMeKalbo ma domniemany, wiec tu nie
MeMeKmusialem
13:55MeMeKok w jakiej kolejnosci sa wywolywane konstruktory
MeMeKotoz kazda klasa napierw wywoluje konstruktor swojej matki
MeMeKwiec najpierw starsi
MeMeKpotem dzieci
13:56MeMeKhttp://memek.piwko.pl/wyklad_obiekt/przyklad13.cpp
MeMeKwidzimy 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:57MeMeKwidzimy ze faktycznie najpierw sa wywalywane konstruktory starszych
MeMeKpierwszy wypis K podst jest wywolany przrz
MeMeKfigura2D figura;
MeMeKsami stworzylismy obiekt klasy podstawowej
MeMeKa to
13:58MeMeKkwadrat moj_kwadrat("kwadrat", "czarny");
MeMeKodpowiada tym wypisom
MeMeKK podst
MeMeK
MeMeKK dziecka
13:59MeMeKok tearz mamy prosta droge do wirtualnosci i polimorfizmu ;>
MeMeKpopatrzmy na to
MeMeKhttp://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:00MeMeKniby dziala jak trzeba
MeMeKi tak jest w istocie
MeMeKale
MeMeKhttp://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.
MeMeKco jest do licha?
MeMeKprzeciez mamy wyraznie
14:01MeMeKfigura2D * p_inny;
MeMeKp_inny = p_kwadrat;
MeMeKp_inny->ile_bokow();
MeMeKwzkaznik p_inny pokazuje na obiekt kwadrat
MeMeKwiec dalczego mowi ze ma x bokow
MeMeKjak ma 4
MeMeKhmm
MeMeKw sumie to to jest dobrze
14:02MeMeKkompilator pomyslal maszynowo
MeMeKw koncu wzkaznik
MeMeKp_inny
MeMeKjest wzkaznikiem to pokazywania na obiekty typy figura2D
MeMeKkompilator olal to ze aktualnie pokazuje na obiekt klasy kwadrat
14:03MeMeKi wywolal funkcje skladowa ile_bokow() jak dla obiektu typu figura2D
MeMeKto dla nas zle
14:04MeMeKto dlatego ze tutaj jest wczesne wiazanie
MeMeKczyli juz na etapie kompilaci wiadomo jaka funkcje wywolac
MeMeKa jednak wiadomo zle
14:05MeMeKhttp://memek.piwko.pl/wyklad_obiekt/przyklad16.cpp
MeMeKspojrzmy
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:06MeMeKno teraz jest tak jak powinno byc
MeMeKolalismy typ wzkaznika tylko patrzymy na to na co pokazuje
MeMeKto sie fachowo nazywa polimorfizmem
MeMeKclass figura2D
MeMeK{
MeMeKpublic:
MeMeKstring opis, kolor;
MeMeKfigura2D (string a = "cos", string b = "jakis") : opis(a), kolor(b) {cout<<"K podst"<<endl;}
MeMeKvoid daj_glos ();
MeMeKvirtual void ile_bokow() {cout <<"mam x bokow"<<endl;}
MeMeK};
MeMeKpojawilo sie cos nowego
MeMeKslowko "virtual"
14:07MeMeKoznacza ono ze ta funkcja (ile_bokow()) jest wirtualna
MeMeKczyli na pewno bedzie zastapiano swoaja lepsza wersja u dzieci
MeMeKvirtual moga byc TYLKO funkcje skladowe
MeMeKnie przyjaciele
14:08MeMeKteraz mamy do czynienia z tzw poznym wizaniem
MeMeKczyli dopiero na etapie uruchamiania wiadomo na co pokazuje wzkaznik
MeMeKi jest wywolywana odpowiednia funkcja
14:09MeMeKpodobnie jesli mamy funkcje ktora jako argument wola obiekt klasy macierzystej
MeMeKa my jej podamy obiekt klasy-dzecka
14:10MeMeKrowniez jesli wewnatrz tej funkcji zostana wywolane jakies metody pierwotnie zakladane jako metody klasy podstawowej
MeMeKto i tak uruchomione zostano funkcje skladowe klasy-dziecka
14:11MeMeKczyli pomijamy typ wzkaznika
MeMeKlub referencji (jesli jej uzywamy)
MeMeKa patzrymy na to na co pokazuje TERAZ wzkaznik
14:12MeMeKto otwiera nowe horyzonty
MeMeKmozemy tworzyc klasy abstrakcyjne
MeMeKnp nasza figura2D jest klasa abstrakcyjna
MeMeKbo przeciez nie mozemy narysowac na papierze "figury"
MeMeKzawsze bedzie to jakis specjalny przypadek tej figury
14:13MeMeKjakis kwadrat, kolo
MeMeKklasa abstrakcyjna zawiera funkcje wirtualne
14:14MeMeKtakie funkcje ktore istnieja tylko po to aby zostale zamienione na lepsze u dzieci
MeMeK;>
MeMeKsa to wtedy tzw funkcje czysto wirtualne
14:15MeMeKwyobrazmy sobie ze jakis tam pra wnuczek naszej klasy nie definiuje wlasnego odpowiednika funkcji wirtualnej
MeMeKjednak mimo to jego potomkowie i tak odziedzicza ja
MeMeKteraz po co to stosowc
14:16MeMeKpo raz. dla wygody (notabene z lenistwa) ;>
MeMeKpo dwa jest tak szybciej
MeMeKpo 3. bo tak ;>
14:17MeMeKjest to chyba najfajniejsza rzecz w programowaniu obiektowym ;>
MeMeKno i to by bylo na dzisiaj tyle
MeMeKzapraszam jutro
MeMeKna mo kolejny wyklad
MeMeKtraktujacy o szablonach i sytuacjach wyjatkowych
14:18MeMeKprzypominam ze ten wyklad mozna komentowac
MeMeKhttp://forum.wyklady.net/index.php?topic=74.0
MeMeKo tutaj
MeMeKno to dzieki za uwage
MeMeKpa