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 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.
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 nastavi podatke na privzete vrednosti.
Kompleksno::Kompleksno()
{
realni = imaginarni = 0.0;
}
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 pretvori realno število v kompleksno število
Kompleksno::Kompleksno(double r)
{
realni = r;
imaginarni = 0.0;
}
Konstruktor, ki ustvari kompleksno število iz dveh realnih števil
Kompleksno::Kompleksno(double r, double i)
{
realni = r;
imaginarni = i;
}
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;
}
Kompleksno::Kompleksno(double r=0.0, double i=0.0)
{
realni = r;
imaginarni = i;
}
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)
{
}
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
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().