next up previous contents
Elõre: Konstruktorok definiálása Fel: Programozás C++-ban Vissza: A this nevûimplicit

Konstruktorok és destruktorok

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.
 



next up previous contents
Elõre: Konstruktorok definiálása Fel: Programozás C++-ban Vissza: A this nevûimplicit