Sunteți pe pagina 1din 7

Universitatea Tehnica a Moldovei

Catedra Informatica aplicata

Disciplina: Programarea avansata

RAPORT
Lucrare de laborator Nr.1
Varianta 14

Tema: Constructorul funcie de iniializare a


obiectelor clasei

A efectuat :

studentul grupei IBM-151


Stadnic Eugeniu

A verificat:

conferentiar universitar, doctor


Kulev Mihail

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.

Constructorul implicit constructor fr parametri, sau constructor cu toi parametrii implicii.


Constructorul de copiere constructor care are ca parametru referin la obiectul clasei respective.
Constructorul de copiere poate avea i ali parametri care ns trebuie s fie implicii.
Constructorul de conversie a tipului - constructorul, care transform un tip de obiect n altul.
Constructorul general constructorul care nu corespunde categoriilor enumerate mai sus.
Fie exemplul:
class Book{
char *author;
int year;
int pages;
public:
Book();
// constructor implicit
Book(const Book&); // constructor de copiere
Book(const char*); // constructor de conversie a tipului
Book(char*, int, int);
// constructor general
...
};
...
void main(){
Book b(Stroustrup,1997,890);
// general
Book b1 = b, b11(b);
// de copiere
Book b2 = Stroustrup, b21(Bjarne);
// de schimbare a tipului
Book b3;
// implicit
}
Constructori generai de compilator. Interaciunea lor cu constructorii definii de utilizator
Prezena constructorilor nu este obligatorie. Se pot defini clase i fr constructori. n acest caz,
compilatorul C++ genereaz n mod automat un constructor implicit i de copiere.
Constructorul implicit generat nu realizeaz absolut nimic, iar constructorul de copiere generat
automat implic copierea bit cu bit, ceea ce nu ntotdeauna este satisfctor. n cazul definirii unui
constructor de ctre utilizator se genereaz automat numai constructorul de copiere.
Recomandri
Fiecare clas trebuie s conin constructori. Dac clasa conine elemente pointeri trebuie neaprat
s se suprancarce constructorul de copiere, care se utilizeaz pentru crearea copiilor obiectului, la apelul
obiectului n funcie. Motivul suprancrcrii constructorului de copiere const n necesitatea utilizrii
aciunilor suplimentare n comparaie cu algoritmul standard de copiere, deoarece se poate ntmpla ca
dou obiecte diferite s refere una i aceeai memorie, ceea ce poate duce la pierderea informaiei i la
erori n sistemul de operare.
Exemplu de constructori de copiere:

Book::Book(const Book& b){


author = new char[strlen(b.author)+1];
strcpy(author, b.author);
year = b.year;
pages = b.pages;
}
Constructorii trebuie s utilizeze mecanisme numite iniializatori (lista de iniializare). Aceast
regul contribuie la evitarea cheltuielilor necesare pentru iniializarea cmpurilor clasei, deoarece la
execuia constructorului cmpurile trebuie s fie deja iniializate, iar la execuia iniializatorilor nu.

Book::Book(const Book& b): year(b.year),pages(b.pages),


author(new char[strlen(b.author)+1])
{
strcpy(author, b.author);
}
// apelul funciei strcpy a rmas n afara iniializatorului.
n cazul utilizrii tabloului de obiecte se definete n mod obligatoriu un constructor implicit, care
se apeleaz pentru iniializarea elementelor tabloului.

Codul programului in C++


#include <iostream.h>
#include <conio.h>
#include <string.h>
class Bani{
int lei;
int bani;
public:
Bani(){
lei=bani=0;}
Bani(int x, int y){
lei=x; bani=y;}
~Bani(){
lei=bani=0;}
void set(int x, int y){
lei=x; bani=y;}

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

S-ar putea să vă placă și