Két speciális, elõredefiniált függvénymezõ-fajta létezik, amelyek kulcszerepet játszanak a C++-ban. Ezek a konstruktorok ( constructors) és a destruktorok (destructors). Hogy jelentõségüket megértsük, tegyünk egy kis kitérõt.
Általános probléma a hagyományos nyelveknél az inicializálás. Mielõtt használnánk egy adatstruktúrát, gondoskodnunk kell arról, hogy megfelelõ tárterületet biztosítsunk az adatstruktúra számára és megfelelõ kezdeti értékkel rendelkezzen a adott típusú változó. Tekintsük a point osztály egy korábbi deklarációját:
class point {
int x;
int y;
colortype color;
};
Kezdõ programozók az egyes adatmezõket így
inicializálnák:
point a_point; .... a_point.x = 10; a_point.y = 25; a_point.colortype = black;Ez a kezdeti értékadás korrekt, de csak az a_point változónak ad értéket. Ha több point típusú változót akarunk inicializálni, akkor többször meg kell ismételni a fentihez hasonló értékadó utasításokat. A következõ természetes lépés az lenne, hogy írunk egy inicializáló függvényt, amely tetszõleges, argumentumként átadott point típusú objektumot inicializál.
void init_point(point* target, int newx, int newy)
{
target->x = newx;
target->y = newy;
target->color = black;
}
Ezt a függvényt jól terveztük meg: tetszõleges
point típusú objektumot inicializál. De miért
kell megadnunk az inicializáláshoz az osztály típusát
és azt a konkrét objektumot, amelynek kezdeti értéket
kell adnunk? A válasz egyszerû: azért, mert nem függvénymezõként
deklaráltuk az inicializáló függvényt.
Amire igazán szükségünk van, az egy olyan függvénymezõ,
amelyik tetszõleges point típusú objektumot
automatikusan inicializál. Az ilyen függvénymezõt
konstruktornak nevezzük.
A C++ filozófiájának egyik lényeges eleme, hogy a felhasználó által definiált adattípusok ugyanolyan integráns részei legyenek egy programnak, mintha beépített típusok lennének. Ezért a C++ különleges függvénymezõket kínál számunkra, amelyek meghatározzák, hogy milyen módon hozhatók létre egy adott osztály objektumai. Ezek a konstruktorok. Egy konstruktor lehet a felhasználó által definiált, vagy lehet a C++ rendszer alapértelmezése szerinti. A konstruktorokat akár explicit, akár implicit módon meghívhatjuk. A C++ mindig automatikusan meghívja a megfelelõ konstruktort, amikor egy adott osztállyal objektum-példányt definiálunk. Ez akár definició, akár egy objektum másolása, vagy akár a new operátorral (lásd késõbb) dinamikusan létrehozott objektumok esetében megtörténik.
A destruktorok - mint ahogy nevük is mutatja - egy konstruktor
által korábban létrehozott objektum megszüntetésében
segítenek: törlik a mezõk tartalmát és
általában felszabadítják az objektum által
elfoglalt tárterületet. A destruktorok szintén explicit
módon (lásd a delete operátort késõbb),
akár implicit módon - például egy automatikus
változó megszûnésekor - aktivizálhatók.
Ha nem definiálunk mi magunk destruktort egy adott osztályhoz,
a C++ a saját alapértelmezése szerinti változatát
fogja használni. Egy általunk definiált destruktor
egy objektum megszûnésével kapcsolatos kiegészítõ
mûveleteket végezhet, például adatokat írhat
diszkre, file-okat zárhat le, képernyõt törölhet,
stb.