Miskolci Egyetem Általános Informatikai Tanszák
Speciális Speciális adattagok és tagfüggvények Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék Ficsor Lajos
CPP7 /
1
Statikus adattagok Bármely adattag lehet static tárolási osztályú A statikus adattag az osztály valamennyi objektuma számára egy példányban létezik, azok osztottan használják. Globális változó az osztályra nézve. Nem a this mutatón keresztül történik az elérése. Különbségek a valódi globális változóval szemben: Lehet private (információrejtés) Nem szerepel a globális névtérben, az osztály hatáskörében érvényes (nem lehet névütközés) Ficsor Lajos
Bevezetés a C++ programozási nyelvbe
CPP7 /
2
Statikus adattag inicializálása Az objektumok előtt kell létrejönnie Az osztályban az adattagnak csak deklarációja lehet A statikus adattag definíciója minden tagfüggvények kívül helyezkedhet el. Célszerű helye az osztály implementációs file-ja. Inicializálása nem történhet a konstruktorban, csak a definíciójában. Ficsor Lajos
Ficsor Lajos
Bevezetés a C++ programozási nyelvbe
CPP7 /
3
CPP0/ 1
Miskolci Egyetem Általános Informatikai Tanszák
Statikus adattagok adattagok használata private adattag Csak osztályon belül használható. Definíciója (és inicializálása) megengedett az osztályon kívül.
public adattag Használata sérti az információrejtést Bárhol használható, ahol az osztálya ismert
Használható az osztály bármelyik objektumával, vagy osztálynévvel és SCOPE operátorral Nem használható önmagában (osztályhatáskörben van!) Ficsor Lajos
Bevezetés a C++ programozási nyelvbe
CPP7 /
4
Statikus tagfü tagfüggvé ggvény Tagfüggvény tárolási osztálya is lehet static Az ilyen függvény a this mutatóra sem közvetlenül, sem közvetve nem hivatkozhat Következmény: csak statikus adattagokat és statikus tagfüggvényeket használhat.
Meghívható az osztály bármelyik objektumával, vagy az osztálynévvel és hatáskör (SCOPE) operátorral.
Ficsor Lajos
Bevezetés a C++ programozási nyelvbe
CPP7 /
5
Példa: statikus statikus adattag és tagfüggvény //pelda.hpp class Pelda { // ez csak deklaráció! static int objektumok_szama; // Egyéb adattagok public: Pelda(void); static int darabszam(void); // Egyéb tagfüggvények }; Ficsor Lajos
Ficsor Lajos
Bevezetés a C++ programozási nyelvbe
CPP7 /
6
CPP0/ 2
Miskolci Egyetem Általános Informatikai Tanszák
Példa: statikus statikus adattag és tagfüggvény (folyt.) // pelda.cpp #include "pelda.hpp" // Itt van a definíció int Pelda::objektumok_szama = 0; Pelda::Pelda(void { objektumok_szama++; } Int Pelda::darabszam(void) { return objektumok_szama; } Ficsor Lajos
Bevezetés a C++ programozási nyelvbe
CPP7 /
7
Példa: statikus statikus adattag és tagfüggvény (folyt.) // Foprogram // #include "pelda.hpp" #include
void main(void) { Pelda pelda_objektum; // Ez hibás!! // cout << "Objektumok szama:" << // pelda_objektum.objektumok_szama; Ficsor Lajos
Bevezetés a C++ programozási nyelvbe
CPP7 /
8
Példa: statikus statikus adattag és tagfüggvény (folyt.) // Helyes megoldas: cout << "Objektumok szama:" << pelda_objektum.darabszam() << endl; // Ez is jo: cout << "Objektumok szama:" << Pelda::darabszam() << endl; } Ficsor Lajos
Ficsor Lajos
Bevezetés a C++ programozási nyelvbe
CPP7 /
9
CPP0/ 3
Miskolci Egyetem Általános Informatikai Tanszák
Konstans tagfü tagfüggvé ggvény Minősítése az argumentumlista után tett const alapszóval. Az alapszót mind a függvény prototípusában, mind a definícióban ki kell írni. Jelentése: a konstans tagfüggvény nem változtathatja meg egyetlen adattag értékét sem. Egy ilyen utasítás a függvény törzsében fordítási hibát okoz.
Ficsor Lajos
Bevezetés a C++ programozási nyelvbe
CPP7 /
10
Konstans tagfü tagfüggvé ggvény (folyt.) Haszna: a programozó szándékainak világosabbá tétele A program olvashatóságának javítása célszerű minden olyan tagfüggvényt így deklarálni, amely nem változtat meg egyetlen adattagot sem. Konstansnak deklarált objektummal csak konstans tagfüggvény hívható meg. Ficsor Lajos
Bevezetés a C++ programozási nyelvbe
CPP7 /
11
Virtuá Virtuális destruktor Egy osztály destruktora definiálható virtuálisnak. valamennyi származtatott osztály destruktora is virtuális lesz (bár nevük nem egyezik meg) a virtuális függvényekre vonatkozó szabályok szerint hívódnak meg. Bázisosztály típusú mutatóval megcímzett objektumot megszüntetése esetén a megszüntetendő objektum aktuális típusának megfelelő destruktor aktivizálódik. Ficsor Lajos
Ficsor Lajos
Bevezetés a C++ programozási nyelvbe
CPP7 /
12
CPP0/ 4
Miskolci Egyetem Általános Informatikai Tanszák
Virtuá Virtuális destruktor (folyt.) A bázisosztályban a destruktor valódi virtuális függvény is lehet Ha egy leszármazott osztálynak nincs destruktora, akkor a valódi virtuális függvény hívódna meg. Ez tehát kényszeríti a leszármazott osztályokat arra, hogy mindenképpen definiáljanak destruktort.
A bázisosztályban a virtuális destruktor üres törzsű függvény is lehet minden leszármazott osztály esetén szabadon eldönthető, hogy átdefiniáljuk-e ezt az implementációt Ficsor Lajos
Ficsor Lajos
Bevezetés a C++ programozási nyelvbe
CPP7 /
13
CPP0/ 5