C++ programozási nyelv Gyakorlat - 7. hét
Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2004. november
A C++ programozási nyelv
Soós Sándor
1/17
Tartalomjegyzék ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
Házi feladatok Örököltetés, leszármaztatás Terminológia UML: Unified Modeling Language Példa: Személy-Diák Az igazi megoldás: örökítés Ugyanez kompozícióval Tagfüggvények örökítése Ugyanez kompozícióval Konstruktorok, destruktorok Tanulság Szintetizált konstruktor A default konstruktor hiánya? Példa kompozícióra Példa: Geometriai objektumok
A C++ programozási nyelv
Soós Sándor
2/17
Házi feladatok ●
● ●
●
Ezekből fog kialakulni a laborjegy, ezért is fontos, de ... – a programozást nem lehet másképp megtanulni, mint hogy nekiállunk programokat írni. – meg kell szenvedni azért, hogy elkészüljenek az első önálló programjaink – becsaphatjuk saját magunkat azzal, hogy ezt megspóroljuk (nem írjuk meg a házi feladatot, vagy másolatot adunk be), de e nélkül nem lehet megtanulni a programozást. Mostantól életbe lépnek a múlt héten bemutatott szabályok. Mostantól osztályozni fogjuk a beadott házi feladatokat, minden nap késés 1 jegy levonás! A jövő héten itt az órán kell majd elkészíteni egy programot, amit az óra végén be kell adni osztályzásra.
A C++ programozási nyelv
Soós Sándor
3/17
Örököltetés, leszármaztatás ● ● ●
● ●
●
●
Az objektum-orientált nyelvek talán legfontosabb újítása. A hagyományos nyelvekben nem létezik hasonló fogalom. Különböző nyelvek és tankönyvek eltérő terminológiát és jelölésmódot használnak. Ezek mind hasonló elveket takarnak. Ezeket egyszer kell alaposan megérteni, ezután a különböző nyelvekben jól felhasználhatjuk ezt a tudást. Tehát most nem csak C++ -t tanulunk, hanem objektumorientált programtervezést és gondolkodásmódot is. Ha ezt jól elsajátítottuk, visszatekintve nagyon nehéz lesz elképzelni, hogy korábban hogyan programoztunk és gondolkoztunk másképp!
A C++ programozási nyelv
Soós Sándor
4/17
Terminológia ●
●
Elnevezések: – örököltetés, öröklés, örökítés, leszármaztatás, inheritance, kiterjesztés, extends (Java) – A: alap, bázis, ős, szülő osztály, base class, parent – B: leszármaztatott, gyerek, örököltetett, leszármazott osztály, child – Ezek alatt ugyanazt értjük! – B egy bizonyos fajta A Jelölés: UML Tutorial: – http://pigseye.kennesaw.edu/~dbraun/csis4650/A&D/U ML_tutorial/class.htm
A C++ programozási nyelv
Soós Sándor
5/17
UML: Unified Modeling Language
A C++ programozási nyelv
Soós Sándor
6/17
Példa: Személy-Diák class Szemely { public: intKor; double Suly; }; 1. megoldás: class Diak { public: intKor; double Suly; double TanAtlag; };
A C++ programozási nyelv
2. megoldás: class Szemely { public: intKor; double Suly; double TanAtlag; //ezt nem használjuk, ha nem diák }; Soós Sándor
7/17
Az igazi megoldás: örökítés 3. megoldás: class Diak : public Szemely { public: double TanAtlag; };
●
●
A leszármazott tartalmazza az ős tulajdonságait. Fontos: A gyerekben nem kell külön minősíteni, hogy honnan származik egy adott tulajdonság!
A C++ programozási nyelv
Soós Sándor
int main() { Szemely sz; sz.Suly = 75; Diak d; d.Suly = 63; d.Kor = 22; d.TanAtlag = 3.8; return 0; };
8/17
Ugyanez kompozícióval class Diak { public: Szemely SzemelyiAdatok; doubleTanAtlag; }; ●
●
●
A két megoldás hasonlít egymáshoz. Valószínűleg majdnem minden feladat megoldható mindkét módon. Hogy mikor melyik célszerűbb, az egy megvizsgálandó kérdés. A C++ programozási nyelv
Soós Sándor
int main() { Diak d; d.SzemelyiAdatok.Suly = 63; d.TanAtlag = 3.8; return 0; };
9/17
Tagfüggvények örökítése class Szemely { public: void Beszel() { printf( "beszélek\n" ); } }; class Diak : public Szemely { public: void Vizsgazik() { printf( "jaj\n" ); } }; int main() { Diak d; d.Beszel(); d.Vizsgazik(); return 0; }; A C++ programozási nyelv
Soós Sándor
10/17
Ugyanez kompozícióval class Szemely { public: void Beszel() { printf( "beszélek\n" ); } }; class Diak { public: Szemely Szemely_Resz; void Vizsgazik() { printf( "jaj\n" ); } }; int main() { Diak d; d.Szemely_Resz.Beszel(); d.Vizsgazik(); return 0; }; A C++ programozási nyelv
Soós Sándor
11/17
Konstruktorok, destruktorok class Szemely { public: Szemely() { printf( "Szemely konstruktor\n" ); } ~Szemely() { printf( "Szemely destruktor\n" ); } }; class Diak : public Szemely { public: Diak() { printf( "Diak konstruktor\n" ); } ~Diak() { printf( "Diak destruktor\n" ); } }; int main() { Diak d; return 0; } A C++ programozási nyelv
Mit ír ki? Szemely konstruktor Diak konstruktor Diak destruktor Szemely destruktor Soós Sándor
12/17
Tanulság ●
●
Különböző objektum-orientált nyelvek eltérően rendezik a konstruktorok és destruktorok kérdését: C++ – automatikusan lefut az ős konstruktora, ill. destruktora – nem is tudom én magam meghívni az ős konstruktorát – A sorrend logikája: ●
●
●
Az őst inicializálom előbb, mert a gyerek már felhasználhat ebből valamit. Például a diák évfolyama függhet az életkorától
Delphi (Pascal) – nekem kell gondoskodnom az ős konstruktorának, ill. destruktorának meghívásáról – ha akarom el is hagyhatom
A C++ programozási nyelv
Soós Sándor
13/17
Szintetizált konstruktor ●
Mi történik akkor, ha én nem definiálom a szükséges konstruktorokat? class Szemely { public: Szemely() { printf( "Szemely konstruktor\n" ); } }; class Diak : public Szemely { }; int main() { Diak d; return 0; }
A C++ programozási nyelv
Mit ír ki? Szemely konstruktor Ez akkor is így van, ha a Diakban definiálok egy üres konstruktort. A destruktornál ugyanez a helyzet. Soós Sándor
14/17
A default konstruktor hiánya? ●
Mi történik akkor, ha a fordító nem képes szintetizálni a default konstruktort? class Szemely { public: Szemely( int K, double S) { Kor = k; Suly = S; } int Kor; Mi történik ekkor? double Suly; }; class Diak : public Szemely { public: double TanAtlag; }; int main() { Diak d; return 0; };
A C++ programozási nyelv
Mi történik akkor, ha a Diaknak definiálok default konstruktort?
Tanulság: Ha definiálunk valamilyen konstruktort, akkor definiáljunk default konstruktort is! Soós Sándor
15/17
Példa kompozícióra ●
Van olyan eset, amikor egyértelmű, hogy inkább a kompozíciót választjuk az örökítés helyett: class Szemely { public: void Eltesz() { db.Eltesz(); } Adatbazis db; }; – – –
Ebben az esetben nem jut eszünkbe a Szemelyt örökíteni az Adatbazisból Az Adatbazis egy szolgáltatást nyújt a Szemelynek Nem pedig a Szemely bővíti ki az Adatbazist!
A C++ programozási nyelv
Soós Sándor
16/17
Példa: Geometriai objektumok ●
Tervezzük meg és készítsük el egy geometriai oktató program alaposztályait! – Pont – Szakasz – Egyenes – Kör – Körcikk – Ellipszis – Négyszög – Téglalap (a tengelyekkel párhuzamos állású) – Négyzet (a tengelyekkel párhuzamos állású) – Rombusz (két oldala a tengelyekkel párhuzamos állású) – Háromszög – Speciális háromszögek
A C++ programozási nyelv
Soós Sándor
17/17