Programozás II. 2. gyakorlat Áttérés C-ről C++-ra
Tartalom Új kommentelési lehetőség Változók deklarációjának helye Alapértelmezett függvényparaméterek Névterek I/O műveletek egyszerűsödése Logikai adattípus, string osztály Új header fájlok
Új komment C-ben kommentet a /* */ közé lehetett írni Itt már lehet egysorost is (mint Javaban) a //-el Pl. /* A függvény összeszorozza a két paramétert. */ int szoroz(int a, int b) { return a*b; //visszatér a két paraméter szorzatával }
Változók deklarációja C-ben a változókat a blokk elején, együtt kellett deklarálni Itt bárhol lehet (de legkésőbb az első használat előtt) Ciklusváltozó deklarálható a for-ban is for ( int i = 0 ; i < 10 ; i++ ) { cout << i << endl; } // i++; itt már nem él az i változó
Alapértelmezett fv. paraméterek A függvényparamétereknek a deklarációkor megadhatunk alapértelmezett értéket Tetszőleges számú paraméterhez rendelhetünk értéket, akár az összeshez is. Az ilyen függvények meghívásakor legalább annyi paramétert kell átadni, ahánynak nem adtunk alapértelmezett értéket. Az értékkel rendelkező paramétereknek a paraméterlista végén kell szerepelni
Alapértelmezett fv. paraméterek Helyes példák: double oszt(double a, double b=10) { return a/b; } double oszt(double a=5, double b=10) { return a/b; } double oszt(double a, double b) { return a/b; }
Alapértelmezett fv. paraméterek Helytelen példa: double oszt(double a=10, double b) { return a/b; }
Névterek C++-ban a programot hierarchikusan szervezhetjük a névterek segítségével (hasonlóan, mint Javaban a csomagokkal) Egy névtér megszakítható, majd később folytatható, akár fájlokon át is. Használhatjuk közvetlen hivatkozással: std::cout teljes névtér: using namespace std;
Egyszerűbb IO műveletek Az eddigi printf, scanf függvények helyett előre megírt objektumokkal tudunk I/O műveleteket végezni, sokkal egyszerűbben. cout kiíratást végző objektum cin beolvasást végző obejktum cerr hibakimenetre író objektum endl sortörést jelentő objektum Ezek az objektumok az std névtérben vannak (ld. Előző dia) Használatukhoz az iostream headert kell beilleszteni
Logikai adattípus C++-ban bevezették a logikai adattípust bool kulcsszóval tudok ilyet létrehozni. Értéke true vagy false lehet. Kiíratáskor a 0 vagy 1 értéket veszi fel.
Header fájlok A header fájlokat továbbra is az #include paranccsal lehet beilleszteni. A főbb különbség annyi, hogy máshogy hívják őket include után nem írunk.h kiterjesztést a végére. Pl. I/O műveletekhez az iostream header kell Régi C headeröket is használhatunk: elé kell írni egy c betűt és el kell hagyni a kiterjesztést #include <math.h> helyett #include <cmath>
OOP Ismétlés
Objektumorientáltság Az objektum valamilyen valós életből vett egyed Lehet konkrét, fizikai: személy, kártya, autó Lehet konkrét, nem fizikai: kurzus, hozzászólás Minden objektumot három fontos jellemző ír le Állapot milyen? Viselkedés mit tud csinálni? Identitás ki is ő? A fenti példák mindegyike rendelkezik mindhárommal
Állapot Az objektumot jellemezhetjük a tulajdonságaival (attribútumok) Minden tulajdonság sokféle értéket vehet fel (pl. születési év bármilyen egész szám lehet) Az objektum állapota a tulajdonságnak egy bizonyos kombinációja Pl. egy hallgató állapota lehet 1998-ban született, aktív féléves, 3.5 az átlaga és ABCEABC.SZE az EHA kódja
Viselkedés Az a mód, ahogy viselkedhet, reagálhat külső kérésekre Megmondja, hogy mit csinálhat és azt hogyan teszi Ezeket az objektum metódusai (~függvény) írják le Pl. a hallgató vehet fel vizsgát, adhat le vizsgát, passziváltathatja magát Tehát akkor lesz egy vizsgatfelvesz(), egy vizsgatlead() és egy passzivaltat() metódusa
Identitás Minden egyes objektum egyedi Még akkor is, ha mindenük egyforma A valóságban is, attól, hogy valakik ugyan arra a kurzusra járnak, ugyan abban az évben születtek, még különböző emberek Ettől függetlenül mégis hasonlítanak egymásra Ugyan azokkal a tulajdonságokkal jellemezzük őket Ugyan azokat tudják csinálni
Osztály Az osztály lesz az, ami tárolja a hasonlóságot Itt írjuk le, hogy milyen (mik az attribútumai) Miket tud csinálni (milyen metódusai vannak) Hogy kapcsolódnak más objektumokhoz Az osztály olyasmi lesz az objektumnak, mint az adattípus a változónak, tehát ez lesz a típusa
Objektum Az osztály egy konkrét példánya az objektum Ennek a létrehozását példányosításnak hívjuk Egy osztályból több objektum is lehet Egy objektum csak egy osztály példánya lehet
OOP paradigma alappillérei Abstraction Ami az osztályra tartozik, az legyen is ott Ami csak rá tartozik, azt csak ő lássa Encapsulation + Data hiding Encapsulation Minden, ami összetartozik (adattag, metódus), zárjuk össze egy osztályba Inheritance A közös részeket át lehet örökíteni Újrafelhasználható(bb) kódot írhatunk Polymorphism Egy objektum helyzettől függően több alakot is felvehet Gyerek lehet ős, ős nem lehet gyerek
Öröklődés Az öröklés az OOP paradigma egyik pillére Ha egy osztályt örököltetünk egy másikból, akkor az új (gyerek) megkapja a régitől (ős) az összes tulajdonságát és viselkedését Ezeket módosíthatja (ha engedjük), illetve kiegészítheti újakkal Overriding: ha definiálunk egy metódust, amilyen már volt az ősben, akkor felülírom, futásidőben dől el, hogy melyiket hívjuk
Öröklődés Az öröklődés specializáció/általánosító kapcsolat, attól függ, honnan nézzük A gyermek specializálja (szűkíti) az őst Az ős osztály a gyereknek egy általános (bővebb) esete Többszörös öröklődés: Javaban nincs! - de C++-ban lesz Egyszerre több dolog öröklése máshogy van megoldva, ld. később
Láthatóság OOP paradigma egyik fontos eleme: egységbezárás (encapsulation) Zárjuk össze és rejtsük el a külvilág elől, amit csak lehet Ezt a láthatóság módosításával érhetjük el
Polimorfizmus Leszármazott típusú osztályt mindig használhatunk ős típus helyett Metódus paraméterként Tömbben Objektum referenciánál Visszatérési értékként Őst viszont nem tudunk leszármazottra alakítani Kivéve, ha eredetileg leszármazott típusú volt és upcast miatt lett ős Ld. később
Konstruktor Speciális metódus, ami az objektum példányosításakor hívódik meg Példányosítást már nem tudja megakadályozni Kezdeti teendők megvalósítására szolgál A neve ugyan az, mint az osztálynak Nincs visszatérési értéke Lehet többféle paraméterlistája is lehet - overloading Általában public Minden osztálynak van default konstruktora
Overloading Azonos metódusnév, különböző paraméterlista A híváskor kapott paraméterek alapján dönt