Documente Academic
Documente Profesional
Documente Cultură
RAPORT
Lucrare de laborator Nr.1
Varianta 14
A efectuat :
A verificat:
Chisinau 2015
Tema: Constructorul funcie de iniializare a obiectelor clasei
Scopul lucrrii:
Studierea principiilor de definire i utilizare a constructorilor
Studierea principiilor de definire i utilizare a destructorilor
Studierea tipurilor de constructori
Scriei un program care efectueaz urmtoarelor operaii asupra unitilor bneti (de exemplu, lei, bani):
adunarea,
nmulirea cu un coeficient,
scderea,
mprirea la un coeficient,
valoarea numeric a unitilor bneti s se tipreasc cu cuvinte.
Noiuni de baz
Una din cele mai rspndite erori de programare (n orice limbaj) const n utilizarea obiectelor fr
iniializare anterioar, aa precum nu toate limbajele asigur iniializare automat. Desigur, poate fi
definit funcia de iniializare i de distrugere a obiectului:
class Book{
char *author;
int year;
int pages;
public:
void Init(char*, int, int);
void Destroy();
};
void Book::Init(char* a, int y, int p){
author = new char[strlen(a)+1];
strcpy(author,a);
year=y;
pages=p;
}
void Book::Destroy(){
delete[] author;
}
n acest exemplu, ns, nimeni nu garanteaz c iniializarea va avea loc, sau c va fi eliberat
memoria alocat. Alt neajuns al exemplului dat const n pericolul scurgerii de memorie, deoarece funcia
de iniializare poate fi apelat de nenumrate ori. De asemenea se poate bloca sistemul din cauza utilizrii
eronate a memoriei dinamice, motivul fiind apelul funciei Destroy fr iniializare.
Definire i utilizare
Pentru a evita aceast eroare, C++ asigur mecanismul de iniializare automat pentru clasele
definite de utilizator constructorul clasei. Iar pentru operaiile de distrugere destructorul clasei.
Constructorul este o funcie membru special, de acelai nume cu numele clasei, care se apeleaz
automat la crearea obiectului de tipul clasei. Constructorul nu returneaz nici un rezultat, chiar nici void.
Compilatorul garanteaz apelarea unic a constructorului pentru un singur obiect.
Destructorul este o funcie membru special, care se apeleaz automat la distrugerea obiectului.
Numele unui destructor este numele clasei precedat de caracterul ~.Compilatorul garanteaz apelarea
unic a destructorului pentru un singur obiect. Un destructor nu are parametri, de aceea nu poate fi
suprancrcat, i el este unic pentru o clas.
Pentru un obiect local, destructorul se apeleaz cnd controlul programului iese din domeniul lui (se
iese din blocul n care este declarat). Obiectele dinamice nu pot fi distruse automat. Distrugerea se
realizeaz de ctre programator prin intermediul operatorului delete, care apeleaz, propriu zis,
destructorul.
Fie un exemplu analogic cu cel precedent, utiliznd constructorul i destructorul:
class Book{
char *author;
int year;
int pages;
public:
Book(char*, int, int);
~Book();
};
Book::Book(char* a, int y, int p){
cout<< Constructor<<endl;
author = new char[strlen(a)+1];
strcpy(author,a);
year=y;
pages=p;
}
Book::~Book(){ cout<<Destructor<<endl;
delete[] author;
}
void main(){
Book b(Stroustrup,2000,890);
// Book b1;
// ncercarea de a crea obiectul fr
apelul //constructorului duce la erori
Book* ptr = new Book(Lippman,1996, 1200);
// crearea dinamic a obiectului
delete ptr;
// n acest caz eliberarea memoriei se
realizeaz de //ctre programator
}
// aici se apeleaz automat destructorul pentru b.
Tipurile constructorilor
Exist patru tipuri de constructori: implicit, de copiere, de conversie a tipului i general. Aceast
clasificare este bazat pe regulile de definire i utilizare a constructorilor.
void show(){
cout<<"Valoarea baneasca "<<endl;
cout<<"Lei "<<lei<<endl;
cout<<"Bani "<<bani<<endl;
cout<<endl;}
void impartire(int x){
float z,w,q;
w=lei;q=bani;
z=w+q/100; z=z/x;
cout<<"Valoarea in dolari"<<endl;
cout<<"Dolari "<<z<<endl;
}
void inmultire(float x){
float z,w,q,k,l;
w=lei;q=bani;
z=w+q/100;z=z*x;
cout<<"Valoarea in ruble rusesti"<<endl;
cout<<"Ruble "<<z<<endl;}
void adunare(Bani& b1){
lei=lei+b1.lei;
bani=bani+b1.lei;}
void scadere(Bani& b1){
lei=lei-b1.lei;
bani=bani-b1.lei;}
};
void main(void){
Bani b, b1;
int x,y;
cout<<"Introdu valoarea unitatilor banesti"<<endl;
cout<<"Lei ";cin>>x;
cout<<"Bani ";cin>>y;cout<<endl;
b.set(x,y);
b.show();
cout<<endl;
cout<<"Introdu curs valutar Dolari"<<endl;cin>>x;
b.impartire(x) ;
cout<<endl;
cout<<endl;
cout<<"Introdu curs valutar Ruble rusesti"<<endl;cin>>x;
b.inmultire(x);
cout<<endl;
cout<<"Introdu valoarea unitatilor banesti secundare"<<endl;
cout<<"Lei ";cin>>x;
cout<<"Bani ";cin>>y;cout<<endl;
b1.set(x,y);
cout<<"Valoarea baneasca secundara"<<endl;
b1.show();
b.adunare(b1); cout<<endl;
cout<<"Valoarea baneasca adunata "<<endl;
b.show();
b.scadere(b1);
cout<<endl;
cout<<"Valoarea baneasca scazuta "<<endl;
b.show();
getch();
}
Screenshot-urile