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.