Documente Academic
Documente Profesional
Documente Cultură
Pentru a simplifica procesul de iniţlizare a membrilor de date, C++ permite definirea unei funcţii
speciale constructor, specifică fiecărei clase, care va fi apelată la fiecare craeare a unui obiect. În mod
simetric, C++ permite şi specificarea unei funcţii destructor pe care o apelează la distrugerea unui
obiect.
• Funcţiile constructor sunt metode ale claselor ce înlesnesc iniţializarea membrilor de date ai
claselor
• Funcţiile constructor au acelaşi nume cu clasa respectivă, numele funcţieie constructor nu
se precde, însă, cu cuvântul cheie void.
• Funcţiile constructor nu întorc nici o valoare
• De fiecare dată când un program creează o variabilă de tipul uni clase, C++ apelează funcţia
constructor, în cazul în care aceasta există
• Rularea unui program implică alocarea de memorie în scopul stocării de infpormaţii ale
diferitelor obiecte. La distrugerea unui obiect, C++ apelează o funcţie specială destructor care
poate elibera această memorie.
• Funcţiile destructor au acelaţi nume cu clasa respectivă, dar acest nume trebuie precedat de
caracterul (~).
• Funcţiile destructor nu întorc nici o valoare. Asemeni funcţiilor constructor, numele unei
funcţii destructor nu sunt precedate de cuvântul cheie void.
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
class Carte
{
public:
Carte(char *btitlu,char *bautor,char *beditura,
float bpret); //Constructorul clasei
char titlu[256];
char autor[64];
float pret;
void arata_titlu(void)
{ cout<<titlu<<'\n';}
float da_pret(void)
{ return(pret);};
void arata_carte(void)
{
arata_titlu();
arata_editura();
};
void atrib_editura(char *nume)
{strcpy(editura,nume);};
private:
char editura[256];
void arata_editura(void)
{cout<<editura<<'\n';};
};
Carte::Carte(char *btitlu,char *bautor,char *beditura, float bpret)
{
strcpy(titlu,btitlu);
strcpy(autor,bautor);
strcpy(editura,beditura);
pret=bpret;}
void main(void)
{
Carte volum("Print si cersetor","Mark Twain","Teora",100000);
volum.arata_carte();
cout<<"Pretul cartii este:"<<volum.da_pret()<<endl;
system("pause");
}
Programul poate defini funcţia constructor în cadrul clasei sau în exteriorul acesteia. Atunci
când programele declară ulterior un obiect, el poate transmite parametri către funcţia constructor,
după care funcţia constructor se execută automat, iniţializând varibilele membre ale clasei.
Dacă numele parametrilor funcţiei constructor s-ar iniţializa cu aceleaşi nume cu numele
datelor membre ale clasei acestea s-ar confunda şi de aceea trebuie folosit operatorul :: astfel:
se înlocuieşte cu :
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
class Angajat
{
public:
Angajat(char *,long, float);
void arata_Angajat(void);
int schimba_salariu(float);
long get_id(void);
private:
char nume[64];
long angajat_id;
float salariu;
};
void main(void)
{
Angajat muncitor ("Popescu Ion",11,6000);
muncitor.arata_Angajat();
system("pause");
}
Exemplul 1:
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#include <iomanip.h>
class Carte
{
public:
Carte(char *btitlu,char *bautor,char *beditura,
float bpret); //Primul constructor
Carte(void); //Al doilea constructor
char titlu[256];
char autor[64];
float pret;
void arata_titlu(void)
{ cout<<titlu<<'\n';}
float da_pret(void)
{ return(pret);};
void arata_carte(void)
{
arata_titlu();
arata_editura();
};
void atrib_editura(char *nume)
{strcpy(editura,nume);};
private:
char editura[256];
void arata_editura(void)
{cout<<editura<<'\n';};
};
Carte::Carte(char *btitlu,char *bautor,char *beditura, float bpret)
{
strcpy(titlu,btitlu);
strcpy(autor,bautor);
strcpy(editura,beditura);
pret=bpret;}
Carte::Carte(void)
{ cerr<<"\nTrebuie sa specificati valori initiale la crearea obiectului\n";
exit(1);}
void main(void)
{
Carte volum("Print si cersetor","Mark Twain","Teora",100000);
volum.arata_carte();
cout<<"Pretul cartii este:"<<volum.da_pret();
Carte volum1;
volum1.arata_carte();
system("pause");
}
Exemplu 2 :
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
class Angajat
{
public:
Angajat(char *, long, float);
Angajat(char *, long);
void arata_Angajat(void);
int schimba_salariu(float);
long get_id(void);
private:
char nume[64];
long angajat_id;
float salariu;
};
void Angajat::arata_Angajat(void)
{
cout<<"Angajat:"<<nume<<endl;
cout<<"Id:"<<angajat_id<<endl;
cout<<"Salariu:"<<salariu<<endl;
}
void main(void)
{
Angajat muncitor1 ("Popescu Ion",11,150);
Angajat muncitor2 ("Ionescu Ion",12);
muncitor1.arata_Angajat();
muncitor2.arata_Angajat();
system("pause");
}
În mod asemănător, C++ permite definirea unei funcţii destructor ce rulează de obicei în una
din următoarele două situaţii: fie când programul se termină fie când este utilizat operatorul delete
pentru a elibera memoria alocată instanţei. Funcţiile destructor au aceeai denumire cu clasa şi
diferă de funcţia constructor prin caracterul tilda(~) care precedă numele funcţiei destructor.
Funcţiile destructor nu acceptă parametri şi nu declararea lor se face fără valoare de returnat.
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
class Carte
{
public:
Carte(char *btitlu,char *bautor,char *beditura,
float bpret); //Constructorul clasei
~Carte(void);
char titlu[256];
char autor[64];
float pret;
void arata_titlu(void)
{ cout<<titlu<<'\n';}
float da_pret(void)
{ return(pret);};
void arata_carte(void)
{
arata_titlu();
arata_editura();
};
void atrib_editura(char *nume)
{strcpy(editura,nume);};
private:
char editura[256];
void arata_editura(void)
{cout<<editura<<'\n';};
};
Carte::Carte(char *btitlu,char *bautor,char *beditura, float bpret)
{
strcpy(titlu,btitlu);
strcpy(autor,bautor);
strcpy(editura,beditura);
pret=bpret;}
Carte::~Carte(void)
{
cout<<"\nA fost distrus obiectul cu titlul: "<<titlu<<'\n';
}
void main(void)
{
Carte volum1("Print si cersetor","Mark Twain","Teora",100000);
volum1.arata_carte();
Carte volum2("Insula cu elice","Jules Vernes","Teora",200000);
volum2.arata_carte();
system("pause");
}
Exemplul 2 :
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
class Angajat
{
public:
Angajat(char *, long, float);
~Angajat(void);
void arata_Angajat(void);
int schimba_salariu(float);
long get_id(void);
private:
char nume[64];
long angajat_id;
float salariu;
};
void Angajat::arata_Angajat(void)
{
cout<<"Angajat:"<<nume<<endl;
cout<<"Id:"<<angajat_id<<endl;
cout<<"Salariu:"<<salariu<<endl;
}
void main(void)
{
Angajat muncitor ("Popescu Ion",11,150);
muncitor.arata_Angajat();
system("pause");
}
Este posibil în C++ ca un obiect să apeleze alt obiect. Programul următor creează două tipuri
de obiecte: un obiect care conţine informaţii despre o carte şi un obiect care conţine informaţii despre
un cititor. Obiectul Cititor apelează obiectul Carte pentru a afişa informaţii despre cartea preferată a
unui cititor:
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
class Carte
{
public:
Carte(char *titlu)
{
strcpy(Carte::titlu,titlu);
}
void arata_carte(void)
{
cout<<titlu;
}
private:
char titlu[64];
};
class Cititor {
public:
Cititor (char *nume)
{
strcpy(Cititor::nume,nume);
}
void arata_cititor(class Carte carte)
{
cout<<"Cititor: "<<nume<<endl<<"Carte preferata: ";
carte.arata_carte();
}
private:
char nume[64];
};
void main(void)
{
Cititor cititor("Ionel");
Carte carte_preferata("Shogunul");
Cititor.arata_cititor(carte_preferata);
system("pause");
}
Modul de lucru: