Speciális adattagok és tagfüek Miskolci Egyetem Általános Informatikai Tanszék 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) 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üek 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. Bevezetés a C++ programozási nyelvbe CPP7 / 3
Statikus 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!) Bevezetés a C++ programozási nyelvbe CPP7 / 4 Statikus tagfüggv Tagfü tárolási osztálya is lehet static Az ilyen fü a this mutatóra sem közvetlenül, sem közvetve nem hivatkozhat Következmény: csak statikus adattagokat és statikus tagfüeket használhat. Meghívható az osztály bármelyik objektumával, vagy az osztálynévvel és hatáskör (SCOPE) operátorral. Bevezetés a C++ programozási nyelvbe CPP7 / 5 adattag és tagfü //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üek }; Bevezetés a C++ programozási nyelvbe CPP7 / 6
// 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; } Bevezetés a C++ programozási nyelvbe CPP7 / 7 // Foprogram // #include "pelda.hpp" #include <iostream.h> void main(void) { Pelda pelda_objektum; // Ez hibás!! // cout << "Objektumok szama:" << // pelda_objektum.objektumok_szama; Bevezetés a C++ programozási nyelvbe CPP7 / 8 // Helyes megoldas: cout << "Objektumok szama:" << pelda_objektum.darabszam() << endl; // Ez is jo: cout << "Objektumok szama:" << Pelda::darabszam() << endl; } Bevezetés a C++ programozási nyelvbe CPP7 / 9
Konstans tagfüggv Minősítése az argumentumlista után tett const alapszóval. Az alapszót mind a fü prototípusában, mind a definícióban ki kell írni. Jelentése: a konstans tagfü nem változtathatja meg egyetlen adattag értékét sem. Egy ilyen utasítás a fü törzsében fordítási hibát okoz. Bevezetés a C++ programozási nyelvbe CPP7 / 10 Konstans tagfüggv (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üt így deklarálni, amely nem változtat meg egyetlen adattagot sem. Konstansnak deklarált objektummal csak konstans tagfü hívható meg. Bevezetés a C++ programozási nyelvbe CPP7 / 11 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üekre 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. Bevezetés a C++ programozási nyelvbe CPP7 / 12
Virtuális destruktor (folyt.) A bázisosztályban a destruktor valódi virtuális fü is lehet Ha egy leszármazott osztálynak nincs destruktora, akkor a valódi virtuális fü 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ü is lehet minden leszármazott osztály esetén szabadon eldönthető, hogy átdefiniáljuk-e ezt az implementációt Bevezetés a C++ programozási nyelvbe CPP7 / 13