next up previous contents
Elõre: Destruktorok definiálása Fel: Konstruktorok és destruktorok Vissza: Konstruktorok és destruktorok

Konstruktorok definiálása

Most tekintsük át elõször a konstruktorok definiálását a megszokott point típusunk esetében; bõvítsük ki az eddigi deklarációt egy konstruktorral.

            class point
                  {
                    int       x;
                    int       y;
                    colortype color;
                    int       get_x(void) { return x; }
                    int       get_y(void) { return y; }             
                    colortype get_color(void);                              
                    void      show(void);
                    void      hide(void);
                    point(int newx, int newy);
                         // konstruktor deklaracio
                  };
            point::point(int newx = 0, int newy = 0)
            {            // konstruktor definicio
              x = newx;
              y = newy;
              color = black;
            }
A konstruktort ugyanúgy deklarálhatjuk, mint minden egyéb függvénymezõt. Figyeljük ugyanakkor meg, hogy a konstruktor neve és az osztály neve ugyanaz, mind a kettõ point. Innen tudja a fordítóprogram, hogy az adott függvénymezõ egy konstruktor. Figyeljük meg azt is, hogy mint minden függvénynek, a konstruktornak is lehetnek paraméterei, a konstruktor törzse pedig egy szabályos függvénytörzs. Ez azt jelenti, hogy egy konstruktor hívhat más függvényeket és minden, a hatáskörébe tartozó adathoz hozzáférhet. Az egyetlen, de lényeges különbség, hogy egy konstruktornak nem lehet típusa, még void sem! (Így értéket sem adhat vissza.) A fenti konstruktor-deklarációt figyelembe véve az alábbi módon deklarálhatunk egy point típusú objektumot:
            point a_point(100,200);
Ez a deklaráció aktivizálja a fent definiált konstruktort, és ennek következtében a pont x és y koordinátája rendre 100 ill. 200 lesz. Az overloading a konstruktorok esetében is alkalmazható, így egy osztálynak több konstruktora is lehet, és mindig az aktuális paraméterlista alapján dõl el, hogy melyik változatot kell aktivizálni. Ha nem definiálunk mi magunk egy konstruktort, akkor a C++ generál egyet, amelynek nincsenek argumentumai. Egy további C++ trükk, hogy az általunk definiált konstruktor argumentumaihoz egy alapértelmezést rendelhetünk, mint ahogy azt a point::point függvény esetében is tettük. Ekkor a
            point a_point(5);
definíció hatására az x koordináta értéke 5 lesz, míg az y koordináta értéke az általunk adott alapértelmezés szerinti 0 marad.

Egy speciális konstruktor az ún. másoló konstruktor ( copy constructor). Ha s egy osztály, akkor a hozzá tartozó másoló konstruktor alakja s::s(s&). A másoló konstruktor jelentõségét megérthetjük, ha arra gondolunk, hogy sztringek tárolására hozunk létre egy s osztályt (tehát nem elégszünk meg a C karaktertömbjeivel, hanem például olyen kifinomult sztringkezelõ rendszert szeretnénk kiépíteni, mint amilyen miatt sokan még mindig ragaszkodnak a BASIC-hez). Ekkor ha a és b egy-egy s osztályba tartozó sztringváltozó, és elvégezzük az a = b értékadást, akkor nem szeretnénk azt, hogy b tartalmának megváltoztatása maga után vonja a tartalmának megváltozását. Hagyományos, egyszerû C sztringkezelés mellett a fenti értékadás csak azt eredményezné, hogy egy karakter-pointer értékét egy másik pointer változóba másoljuk, így ugyanazt a karaktertömböt címzik meg, így a "másolat" nem védhetõ meg az "eredeti" sztringben végrehajtott módosításoktól.


next up previous contents
Elõre: Destruktorok definiálása Fel: Konstruktorok és destruktorok Vissza: Konstruktorok és destruktorok