Ficsor Lajos A C++ programozási nyelv I. CPP1/ 1 Osztály és objektum fogalma.

Slides:



Advertisements
Hasonló előadás
Osztály leszármaztatás
Advertisements

„Esélyteremtés és értékalakulás” Konferencia Megyeháza Kaposvár, 2009
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
C++ programozási nyelv Gyakorlat hét
LFüggvények Alkalmazott Informatikai Tanszék MŰSZAKI INFORMATIKA dr.Dudás László 20./0. lFüggvények deklarációja és prototípusa lA függvénydefiníció lHivatkozás.
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Bevezetés a Java programozásba
1 Programozás alapjai GEIAL312B (ANSI C) BSc (Bachelor of Science) / Alap képzés 2005/2006. őszi félév Miskolci Egyetem Általános Informatikai Tanszék.
5. előadás (2005. március 22.) Függvények definíciója, deklarációja, hívása Enumerációs adattípus 1.
4. előadás (2005. március 8.) Pointerek Pointer aritmetika
Osztályok Garbage collection.  általában minden osztálynak vannak adattagjai és/vagy metódusai ◦ adattagok megadása:  [láthatóság] [static] [final]
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 7. Gyakorlat Operator overloading.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 8. Gyakorlat Operator overloading II.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 5. Gyakorlat Öröklődés, virtuális függvények,
Programozás II. 3. Gyakorlat C++ alapok.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Tömbök ismétlés Osztályok Java-ban Garbage collection
Függvények, mutatók Csernoch Mária.
Mutatók, tömbök, függvények
A Java programozási nyelvSoós Sándor 1/17 Java programozási nyelv 4. rész – Osztályok II. Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai.
Java programozási nyelv 3. rész – Osztályok I.
A C++ programozási nyelvSoós Sándor 1/10 C++ programozási nyelv Gyakorlat - 5. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
A C++ programozási nyelvSoós Sándor 1/15 C++ programozási nyelv Gyakorlat hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
A C++ programozási nyelvSoós Sándor 1/12 C++ programozási nyelv Gyakorlat - 8. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
Java programozási nyelv 5. rész – Osztályok III.
C# tagfüggvények.
JSP és JavaBean JavaServer Pages és Java Beans Fabók Zsolt Általános Informatikai Tanszék Miskolci Egyetem.
C# osztályok Krizsán Zoltán 1.0.
C# osztályok Krizsán Zoltán 1.1.
C# tagfüggvények.
6. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.
© Kozsik Tamás Csomagok. © Kozsik Tamás A program tagolása Típusdefiníciók (osztályok, interfészek) Metódusok Blokk utasítások Csomagok.
Ficsor Lajos Template-ek CPP8/ 1 Template-ek. Ficsor Lajos Template-ek CPP8/ 2 A template fogalma Kiindulási probléma: tetszőleges típusokon kellene ugyanolyan.
Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék
Kivételkezelés a C++ nyelvben Bevezetés
Bevezetés a C++ programozási nyelvbe
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Hernyák Zoltán Programozási Nyelvek II.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
Javascript Microsoft által készített kiegészítése Statikus típusosság Nagy projektek Windows 8 fejlesztésénél WinRT egy részét ebben írták Nyílt forráskódú,
Java programozási nyelv Metódusok
Objektum orientált programozás 3. Függvények Nagy Szilvia.
Objektum orientált programozás
1 Objektum orientált programozás Struktúrák és objektumok gyakorlat Nagy Szilvia.
1 Objektum orientált programozás Öröklődés: többszörös öröklődés, konstruktorok, destruktorok, overloading Nagy Szilvia.
Objektum orientált programozás
Függvények a C nyelvben 1 Függvényeket a következő esetekben szokás írni: Ha ugyanazt a tevékenységet többször is el kell végeznünk ugyanolyan típusú,
C Programozási alapok.
Ficsor Lajos CPP2 / 1 Származtatási mechanizmus a C++ nyelvben Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék.
előadások, konzultációk
Algoritmizálás, adatmodellezés
Típuskonverzió a C++ nyelvben
Ficsor Lajos Objektumok inicializálása CPP4 / 1 Objektumok inicializálása Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék.
Objektum orientált programozás 4. Mutatók, típusok és struktúrák Nagy Szilvia.
Függvények, mutatók Csernoch Mária. Függvények függvény definíciója az értelmezési tartomány tetszőleges eleméhez hozzárendel egy értéket –függvény helyettesítési.
Függvények, mutatók Csernoch Mária. Függvények függvény definíciója az értelmezési tartomány tetszőleges eleméhez hozzárendel egy értéket –függvény helyettesítési.
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Osztályok, objektumok definiálása és alkalmazása. Saját.
Krizsán Zoltán, iit C# osztályok 2 Adattagok  Osztály hatáskörben definiált változó.  Formája: [attribútum] [módosító] típus azonosító [=kezdő érték][,
a programegységek között
Kifejezések C#-ban.
Programozási nyelvek típusossága.
A C++ programozási nyelv
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Konverziós operátorok
Az objektum-orientáltság
Feladat Készítsünk programot, amely ciklikusan egy egyenest forgat 8 fokonként, mialatt 3 db vektort mozgat és forgat 5, 6 ill 7 fokonként, és kijelzi.
Függvénysablonok használata
Előadás másolata:

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 1 Osztály és objektum fogalma

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 2 Az osztály (class) class: adatok és módszerek (method) (függvények) együttese, amely absztrakt adattípusként működik. objektum: egy osztály egy előfordulása módszer: az osztály egy eleme. Olyan függvény, amely az osztályba tartozó adatokon manipulál. Üzenet (message): kommunikáció az objektummal, annak módszerein keresztül.

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 3 Osztálydeklaráció szintaktikája kulcsszó osztálynév { mező lista } A kulcsszó lehet: class (esetleg struct, union) Osztály definícióra használjuk MINDIG a "class" kulcsszót! Az osztály tagjai (mezői) lehetnek: Adatmezők, adattagok (data member) függvény-mezők, tagfüggvények (member function)

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 4 A függvénymezők definíciója lehet belső (ekkor inline-nak minősül) külső (ekkor a hatáskör megjelölése szükséges)

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 5 Hatásköri kérdések Minden osztály egy önálló osztály-hatáskört definiál. (Egységbezárás alapelve!) A meződeklarációk lokálisak az osztály- hatáskörre nézve. A tagfüggvények egy hatáskörben vannak az adattagokkal => használhatják azokat! Hatáskör: scope Egységbezárás: encapsulation

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 6 Osztály használata Az osztálynév típusnévként viselkedik, és minden eddig ismert deklarációs konstrukcióban használható. Objektum: az osztály egy előfordulása. Például: osztály típusú változó

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 7 Hivatkozás a tagokra Analóg a struktúrák kezelésével. Tehát: objektumnév.mező vagy objektum_pointer->mező A mező lehet adattagra való hivatkozás (pontosan úgy, mint a struktúránál) tagfüggvény neve és aktuális paraméter-listája

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 8 Láthatósági kérdések Egy osztály tagjaira való hivatkozás az osztályon kívül alapértelmezés szerint tilos! (Információ rejtés alapelve!) (Information hiding) Láthatóságot szabályozó kulcsszavak: public: a mező bárhol használható ( protected: értelmezése majd később) private: csak az osztályon belül elérhető. Alapszabály: minden adattag private legyen!

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 9 A kulcsszavak a meződeklarációk közé írandók, a kettősponttal együtt. A kulcsszavak hatása a másik kulcsszóig, vagy az osztály deklarációjának a végéig tart. A láthatóságot befolyásolja még a friend mechanizmus is (lásd később).

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 10 Példa: osztálydefiníció class jarmu{ int kerekek; int szemely; int onsuly; public: void beallit(int k, int sz, int suly); double kerek_terheles (void); };

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 11 Példa: tagfüggvények implementációja void jarmu::beallit(int k, int sz,int suly) {kerekek = k; szemely = sz; onsuly = r;} double jarmu::kerek_terheles(void) {return (60.*szemely + onsuly)/ kerekek;}

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 12 Példa: főprogram void main(void) { jarmu bicikli;// Objektum def. bicikli.beallit(2,1,20); printf( “Bicikli kerekterheles: %lf”, bicikli.kerek_terheles() ); }

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 13 Objektum létrehozása Objektum létrehozása: objektum vagy objektumtömb definíció (statikus) new operátor (dinamikus) implicit létrehozás (ideiglenes objektumok) Folyamata: helyfoglalás az adattagoknak konstruktor automatikus meghívása

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 14 Konstruktor Speciális tagfüggvény: neve egyezik az osztálynévvel nem lehet visszatérési értéke (még void sem!) nem hívható meg közvetlenül nem öröklődik Aktuális paraméterlista: deklarációban az objektumnév után new operátornál a típusnév (osztálynév) után

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 15 Destruktor Speciális tagfüggvény: neve ~osztálynév nem lehet visszatérési értéke (még void sem!) nincs paraméterlistája nem hívható meg közvetlenül nem öröklődik Automatikusan meghívódik egy objektum megszűnésekor.

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 16 A this mutató Minden objektumhoz saját adattag-készlet tartozik az osztály összes objektumára közös a tagfüggvény-készlet. Kérdés: hogyan tud a tagfüggvény az aktuális objektum adattagjaira hivatkozni?

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 17 Megoldás: minden objektumra létezik az előredefiniált this mutató, amely az objektum címével inicializálódik. Ezen keresztül indirekt hivatkozással éri el az adattagot a tagfüggvény. A this mutató explicite is elérhető.

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 18 A friend mechanizmus Ha egy F külső függvény egy X osztályban "friend"-ként van deklarálva, a tagfüggvényekkel azonos elérési jogokkal rendelkezik. Az F fgv-en belül az X osztály valamenyi "private" és "protected" eleme is elérhető. Deklaráció: az X osztályban a friend kulcsszó után a függvény prototípusa.

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 19 Példa: friend függvény class X { friend int F (int); // Dekl. int i; public: int tag (double); }; int F (int a)// Def. {... }

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 20 A friend mechanizmus (folyt.) Ha az X osztályban az Y osztály "friend"-ként van deklarálva, az Y osztály összes tagfüggvénye eléri az X osztály "private" és "protected" tagjait is. Deklaráció: az X osztályban a friend class Y; sorral.

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 21 A friend mechanizmus (folyt.) Az Y osztály egy tagfüggvénye is lehet friend az X osztályban. Deklaráció: az X osztályban a friend kulcsszó után a tagfüggvény prototípusa. A tagfüggvény neve előtt az Y:: előtag szükséges! Megjegyzések: a friend viszony nem tranzitív a friend viszony öröklődik

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 22 Fordítási egységek Egy C++ programban az osztálydefiníció csak a tagfüggvények prototípusait tartalmazza, a definíciójuk külön forrásfile-ban van összegyűjtve. Szokásos megoldás: osztalynev.h Osztálydefiníció osztalynev.cpp Tagfüggvények definíciói. Hivatkozik az osztalynev.h file-ra.

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 23 Fordítási egységek (folyt.) Probléma: lehetséges többszörös beillesztés újradefiniálást okozhat fölöslegesen növeli a fordítási időt. Szokásos megoldás: egy pelda.h header file-ra #ifndef PELDA_H #define PELDA_h a header file tartalma #endif

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 24 Operátor overloading fogalma A C++ nyelv lehetőséget nyújt arra, hogy a programozó által definiált típusokra az operátorok átértelmezhetők legyenek. A polimorfizmus implementációja! Egy operátorjel operandusainak típusa határozza meg az operátorjel jelentését. A jelentést függvénydefinícióval (tagfüggvénnyel vagy külső függvénnyel) írhatjuk le.

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 25 Operátor overloading: alapszabályok Minden operátor újraértelmezhető, kivéve a..* :: ?: (feltételes) operátorokat. Az = [] () -> new delete operátorokra speciális szabályok vonatkoznak Az operandusok száma nem változtatható meg Az előredefiniált típusokra vonatkozó operátorok nem definiálhatók újra. (Egy újradefiniált operátor legalább egy operandusa objektum kell legyen!)

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 26 Alapszabályok (folyt.) A precedencia- és asszociativitási szabályok nem változnak meg, azaz a kiértékelés sorrendje ugyanaz marad. Az = operátor kivételével az újradefiniálás öröklődik. Az = operátornak azonos típusú objektumokra van alapértelmezése Nincs kommutativitás (felcserélhetőség) - a standard típusokra sem volt!

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 27 Operátor overloading: definíció Egyoperandusú (unáris) operátor: Az tetszőleges operátorjel) ugyanaz, és a fordítóprogram az alábbi függvényhívások valamelyikével helyettesíti: ahol az x osztályának tagfüggvénye az külső függvény

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 28 Definíció (folyt.) Kétoperandusú (bináris) operátor: Az kifejezést a fordítóprogram az alábbi függvényhívások valamelyikével helyettesíti: ahol az x osztályának tagfüggvénye vagy az külső függvény

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 29 Egyoperandusú operátor feldolgozása Az kifejezés feldolgozásának egy lehetséges forgatókönyve x alaptípusú? Igen Feldolgozás a beépített algoritmus szerint Kész Nem x típusa Cx ? Van helyettesítése az függvényhívással Kész Nincs x) ? Van helyettesítése az függvényhívással Kész Nincs Hibajelzés!Kész

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 30 Kétoperandusú operátor feldolgozása Analóg az egyoperandusú esettel, az alábbi eltérésekkel: –Ha mindkét operandus alaptípusú, a beépített algorimus beépítése –Ha a baloldali operandus osztálytípusú, annak osztályában keres tagfüggvényt –Ha a baloldali operandus alaptípusú, csak a külső operátor függvények között keres

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 31 Operátor függvény paramétereinek száma Egyoperandusú operátor Kétoperandusú operátor Az operátor definiáló függvény tagfüggvény 01 Az operátor definiáló függvény külső függvény 12

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 32 Operátor függvény és az operátor operandusai Egyoperan- dusú operátor Kétoperandusú operátor Az operátor definiáló függvény tagfüggvény Az aktuális objektum Baloldali: az aktuális objektum Jobboldali: a függvény paramétere Az operátor definiáló függvény külső függvény A függvény aktuális paramétere Baloldali: a függvény első paramétere Jobboldali: a függvény második paramétere

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 33 Példa: operátor overloading class complex {//comp.h double valos,kepzetes; public: complex (double v, double k); void kiir (void); complex operator+ (complex z); friend complex operator- (complex z1, complex z2); };

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 34 comp.cpp/1 #include #include ”comp.h” complex::complex (double v, double k) // Konstruktor { valos = v; kepzetes = k; } void complex::kiir (void) { cout << "(" << valos << "," << kepzetes << ")\n"; }

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 35 comp.cpp/2 complex complex::operator+ (complex z) // Osszeadas, tagfüggvény! {return complex(valos+z.valos, kepzetes+z.kepzetes); }

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 36 comp.cpp/3 complex operator- (complex z1, complex z2) // Külső függvény { return complex (z1.valos-z2.valos, z1.kepzetes-z2.kepzetes); }

Ficsor Lajos A C++ programozási nyelv I. CPP1/ 37 proba.cpp #include ”comp.h” void main (void) { complex a(0,0), b(1,1), c(2,2); a = b + c; a.kiir(); // a = b.operator+(c) a = b - c; a.kiir(); // a = operator-(b,c) }