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

Osztály és objektum fogalma

  • 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

Page 1: Osztály és objektum fogalma

FicsorLajos

A C++ programozási nyelv I. CPP1/ 1

Osztály és objektum fogalma

Page 2: 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.

Page 3: Osztály és objektum fogalma

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)

Page 4: Osztály és objektum fogalma

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)

Page 5: Osztály és objektum fogalma

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

Page 6: Osztály és objektum fogalma

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ó

Page 7: Osztály és objektum fogalma

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

Page 8: Osztály és objektum fogalma

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!

Page 9: Osztály és objektum fogalma

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).

Page 10: Osztály és objektum fogalma

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);

};

Page 11: Osztály és objektum fogalma

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;}

Page 12: Osztály és objektum fogalma

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() );

}

Page 13: Osztály és objektum fogalma

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

Page 14: Osztály és objektum fogalma

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

Page 15: Osztály és objektum fogalma

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.

Page 16: Osztály és objektum fogalma

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?

Page 17: Osztály és objektum fogalma

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ő.

Page 18: Osztály és objektum fogalma

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.

Page 19: Osztály és objektum fogalma

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.

{ . . . }

Page 20: Osztály és objektum fogalma

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.

Page 21: Osztály és objektum fogalma

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

Page 22: Osztály és objektum fogalma

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.

Page 23: Osztály és objektum fogalma

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

Page 24: Osztály és objektum fogalma

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.

Page 25: Osztály és objektum fogalma

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!)

Page 26: Osztály és objektum fogalma

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!

Page 27: Osztály és objektum fogalma

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

Page 28: Osztály és objektum fogalma

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

Page 29: Osztály és objektum fogalma

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

Page 30: Osztály és objektum fogalma

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

Page 31: Osztály és objektum fogalma

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

Page 32: Osztály és objektum fogalma

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

Page 33: Osztály és objektum fogalma

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);

};

Page 34: Osztály és objektum fogalma

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"; }

Page 35: Osztály és objektum fogalma

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); }

Page 36: Osztály és objektum fogalma

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);

}

Page 37: Osztály és objektum fogalma

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)

}