Upload
baba
View
56
Download
0
Embed Size (px)
DESCRIPTION
Osztály és objektum fogalma. 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. - PowerPoint PPT Presentation
Citation preview
FicsorLajos
A C++ programozási nyelv I. CPP1/ 1
Osztály és objektum fogalma
FicsorLajos
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.
FicsorLajos
A C++ programozási nyelv I. CPP1/ 3
Osztálydeklaráció szintaktikájakulcsszó osztálynév <:szülők listája>
{ 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)
FicsorLajos
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)
FicsorLajos
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
FicsorLajos
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ó
FicsorLajos
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
FicsorLajos
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!
FicsorLajos
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).
FicsorLajos
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);
};
FicsorLajos
A C++ programozási nyelv I. CPP1/ 11
Példa: tagfüggvények implementációjavoid jarmu::beallit(int k,
int sz,int suly)
{kerekek = k; szemely = sz;
onsuly = r;}
double jarmu::kerek_terheles(void)
{return (60.*szemely + onsuly)/
kerekek;}
FicsorLajos
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() );
}
FicsorLajos
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
FicsorLajos
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
FicsorLajos
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.
FicsorLajos
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?
FicsorLajos
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ő.
FicsorLajos
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.
FicsorLajos
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.
{ . . . }
FicsorLajos
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.
FicsorLajos
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
FicsorLajos
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.
FicsorLajos
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
FicsorLajos
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.
FicsorLajos
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!)
FicsorLajos
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!
FicsorLajos
A C++ programozási nyelv I. CPP1/ 27
Operátor overloading: definíció
Egyoperandusú (unáris) operátor:
Az x@ és @x (@ tetszőleges operátorjel) ugyanaz, és a fordítóprogram az alábbi függvényhívások valamelyikével helyettesíti:
• x.operator@()
ahol operator@ az x osztályának tagfüggvénye• operator@(x)
az operator@ külső függvény
FicsorLajos
A C++ programozási nyelv I. CPP1/ 28
Definíció (folyt.)
Kétoperandusú (bináris) operátor:
Az x@y kifejezést a fordítóprogram az alábbi függvényhívások valamelyikével helyettesíti:
• x.operator@(y)
ahol operator@ az x osztályának tagfüggvénye
vagy• operator@(x,y)
az operator@ külső függvény
FicsorLajos
A C++ programozási nyelv I. CPP1/ 29
Egyoperandusú operátor feldolgozásaAz x@ kifejezés feldolgozásának egy lehetséges forgatókönyve
x alaptípusú? IgenFeldolgozás a beépítettalgoritmus szerint
Kész
Nem
x típusa Cx
Cx::operator@(void) ?Van x@ helyettesítése az
x.operator@()függvényhívással
Kész
Nincs
::operator@(Cx x) ?Van x@ helyettesítése az
operator@(x)függvényhívással
Kész
Nincs
Hibajelzés! Kész
FicsorLajos
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
FicsorLajos
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
0 1
Az operátor definiáló függvény külső függvény
1 2
FicsorLajos
A C++ programozási nyelv I. CPP1/ 32
Operátor függvény és az operátor operandusaiEgyoperan-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
FicsorLajos
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);
};
FicsorLajos
A C++ programozási nyelv I. CPP1/ 34
comp.cpp/1#include <iostream.h>
#include ”comp.h”
complex::complex (double v, double k)
// Konstruktor
{ valos = v; kepzetes = k; }
void complex::kiir (void)
{ cout << "(" << valos << "," << kepzetes << ")\n"; }
FicsorLajos
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); }
FicsorLajos
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);
}
FicsorLajos
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)
}