E-gradiva > Računalništvo > Programiranje > Načrtovanje in razvoj programskih aplikacij > Objektno programiranje > Konstruktorji in destruktorji

Prijava

Konstruktorji in destruktorji

 

KONSTRUKTOR

 


Konstruktor namesti objekt v pomnilnik (rezervira pomnilnik za objekt in inicializira njegove podatke). Inicializacija podatkov se prenese v konstruktor in se avtomatsko izvede ob tvorjenju objekta.

 

DESTRUKTOR

 

Destruktor sprosti pomnilniški prostor objekta (prostor, ki ga zasedajo njegovi podatki).

 

Statično definirani objekti: prevajalnik samodejno pokliče destruktor in sprosti prostor lokalnih objektov ob koncu bloka, globalnih pa ob koncu programa

 

Dinamični objekti, ustvarjeni z operatorjem new: njihov pomnilniški prostor sprosti operator delete, za kar mora poskrbeti programer.

 

Za podatke enostavnih tipov (razredov) programerju ni potrebno napisati implementacije destruktorja, le za zapletenejše in dinamično ustvarjene podatke.

 

 

Vrste konstruktorjev

 

 

Primer – kompleksno število

class Kompleksno
{


public
:
Kompleksno(); // privzeti konstruktor
Kompleksno(double, double); // konstruktor

Kompleksno (const Kompleksno& k); // kopirni konstruktor
Kompleksno (double r); // pretvorbeni konstruktor


~
Kompleksno() { } // destruktor

// ker so tipi podatkov enostavni,
// implementacija destruktorja ni potrebna

void
izpisi() const; // izhod


private
:
double
realni; // realni del
double imaginarni; // imaginarni del

};

 


Privzeti konstruktor

 

Privzeti konstruktor nastavi podatke na privzete vrednosti.

 

Kompleksno::Kompleksno()
{


realni = imaginarni = 0.0;
}

 

 

Kopirni konstruktor


Kopirni konstruktor ustvari nov objekt z istimi vrednostmi, kot jih ima argument.

 

Kompleksno::Kompleksno(const Kompleksno& k)
{


realni = k.realni;
imaginarni = k.imaginarni;
}

 

 

Pretvorbeni konstruktor

 

Pretvorbeni konstruktor pretvori realno število v kompleksno število

 

Kompleksno::Kompleksno(double r)
{


realni = r;
imaginarni = 0.0;
}

 

 

Ostali konstruktorji

 

Konstruktor, ki ustvari kompleksno število iz dveh realnih števil

 

Kompleksno::Kompleksno(double r, double i)
{


realni = r;
imaginarni = i;
}

 

 

Metoda za izpis kompleksnega števila

 

void Kompleksno::izpisi()  const

{

cout << '(' << realni << ", " << imaginarni << ')';
}



int
main()
{

Kompleksno x, y(4.3, 8.2), z(3.3);

cout << "x: ";
x.izpisi();
cout << endl << "y: ";

y.izpisi();
cout << endl << "z: ";

z.izpisi();

Kompleksno w(y);
cout << endl << "w: ";

w.izpisi();

cout << endl;

return
0;
}

 

 

Konstruktorji s privzetimi argumenti

 

Kompleksno::Kompleksno(double r=0.0, double i=0.0)
{


realni = r;
imaginarni = i;
}

 

Inicializacijski seznami

 

Večina konstruktorjev opravlja samo inicializacijo podatkov razreda.

C++ pozna poenostavljeno sintakso za inicializacijo:

 

Kompleksno::Kompleksno(double r=0.0, double i=0.0)
:
realni(r), imaginarni(i) // inicializacijski seznam

{

}


ali npr. pri kopirnem konstruktorju:

 

Kompleksno::Kompleksno(const Kompleksno& k)
:
realni (k.realni), imaginarni (k.imaginarni)
{

}

 

 

Primer uporabe destruktorja:

Kompleksno* x; // kazalec na objekt

// ob ustvarjanju dinamičnega objekta
// se pokliče konstruktor:


x = new Kompleksno(1.0,1.0);



cout << "x: "; // izpis podatkov objekta


x->izpisi();




delete
x; // klic destruktorja sprosti prostor objekta

 

Klic metod in dostop do podatkov objektov, ki so dinamično generirani

 

Za dostop do metod ali podatkov v objektih, ki so dinamično generirani (generirani so z uporabo kazalcev) uporabljamo operator ->.

 

V našem primeru smo uporabili ta operator v x->izpisi(). Enakovreden zapis je tudi: (*x).izpisi().