Sunteți pe pagina 1din 5

Universitatea Tehnic a Moldovei

Facultatea Calculatoare Informatic i Microelectronic


Specialitatea Tehnologii Informaionale
Departament Ingineria, Software i Automatic

Lucrare de laborator 2

La disciplina: Programarea orientat pe obiecte


Tema: Constructorul funcie de iniializare a obiectelor clasei

Efectuat: st.gr. TI-163, Terzi Andrei


Verificat: lect. asis., Scrob Sergiu

Chiinu, 2017
Scopul lucrarii:
1. Studierea principiilor de definire i utilizare a constructorilor
2. Studierea principiilor de dfinire i utilizare a destructorilor
3. Studierea tipurilor de constructori

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.
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.

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.

Listingul programului:
#include <iostream>
#include<string.h>
using namespace std;

class cars {
private:
string model;
int year;
int mileage;
int price;
string color;
public:
cars(){
model="unknown";
year= 0;
mileage=0;
price=0;
color="unknown";
}
cars(string Model, int Year, int Mileage, int Price, string Color ){
model =Model;
year= Year;
mileage=Mileage;
price=Price;
color=Color;
}

cars(const cars& c){


model = c.model;
year =c.year;
mileage=c.mileage;
price=c.price;
color=c.color;
}

void setData(string model, int year, int mileage, int price, string color ){
this->model=model;
this->year=year;
this->mileage=mileage;
this->price=price;
this->color=color;
}
void printData()
{
cout << model<<endl;
cout << year<<endl;
cout << mileage<<endl;
cout << price<<endl;
cout << color<<endl;
cout <<""<<endl;
}
//void cout(){}

~cars(){
cout<<"a fost apelat distructorul"<<endl;
}
};

int main ()

cars c1 ("audi",2010,33333,456789,"white");
c1.printData();
cars c2(c1) ;
c2.printData();
cars c3;
c3.printData();

return 0;
}

Rezultatul execuiei:

Concluzie:
n urma executarii lucrrii date am nvaat ce este un constructor ce tipuri de
constructore sunt i cum se folosec, precum i ce reprezint destructorul, ce funcie
ndeplinete. Am creat o clasa i am diferite obiecte ale clasei am apelat
constructoare diferite. 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.