Sunteți pe pagina 1din 8

Programarea n limbajul C++

LUCRARE DE LABORATOR NR.

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
Noiuni de baz
Argumentarea necesitii

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.

Programarea n limbajul C++


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){
author = new char[strlen(a)+1];
strcpy(author,a);
year=y;
pages=p;
}
Book::~Book(){
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);
delete ptr;

// crearea dinamic a obiectului


// 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;

Programarea n limbajul C++


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.

Programarea n limbajul C++


n cazul utilizrii tabloului de obiecte se definete n mod obligatoriu un constructor
implicit, care se apeleaz pentru iniializarea elementelor tabloului.
ntrebri de control:
1.
2.

3.
4.
5.
6.
7.
8.
9.
10.
11.
12.

Explicai termenul de iniializare.


Ce cuvinte cheie se utilizeaz pentru definirea constructorului i a destructorului?
Poate oare un constructor s returneze o valoare?
Pot oare s existe clase fr constructori?
Ci constructori poate conine o clas? Dar destructori? De ce?
Enumerai tipurile de constructori?
Cum se apeleaz un constructor?
De ce este nevoie de definit un constructor de copiere?
De ce este nevoie de definit un constructor de conversie a tipului?
n ce cazuri se apeleaz constructorul de copiere? Care este sintaxa apelului?
Ce sunt listele de iniializare (iniializatori)?
n care caz se definete obligatoriu constructorul implicit?

Programarea n limbajul C++


Sarcina
Varianta 1
) S se creeze clasa Date dat cu cmpurile: zi(1-28..31), lun(1-12), an (numere ntregi). S
se defineasc constructorii; funciile membru de setare a zilei, lunii i anului; funciile membru
de returnare a zilei, lunii, anului; funciile de afiare: afiare tip 6 iunie 2004 i afiare tip
6.06.2004. Funciile de setare a cmpurilor clasei trebuie s verifice corectitudinea
parametrilor primii.
b) S se creeze clasa Matrix matrice. Clasa conine pointer spre int, numrul de rnduri i de
coloane i o variabil codul erorii. S se defineasc constructorul fr parametri
(constructorul implicit), constructorul cu un parametru matrice ptrat i constructorul cu doi
parametri matrice dreptunghiular . a. S se defineasc funciile membru de acces:
returnarea i setarea valorii elementului (i,j). S se defineasc funciile de adunare i scdere a
dou matrice; nmulirea unei matrice cu alta; nmulirea unei matrice cu un numr. S se
testeze funcionarea clasei. n caz de insuficien de memorie, necoresponden a dimensiunilor
matricelor, depire a limitei memoriei utilizate s se stabileasc codul erorii.
Varianta 2
) ) S se creeze clasa Time timp cu cmpurile: ore (0-23), minute (0-59), secunde (0-59). S
se defineasc constructorii, funciile membru de setare a timpului; de returnare a orei,
minutelor i secundelor; funciile de afiare conform ablonului: ora 17 i 18 minute i 4
secunde i 5 p.m. 18 minute 4 secunde. Funciile de setare a cmpurilor clasei trebuie s
verifice corectitudinea parametrilor primii.
b) S se creeze clasa Matrix matrice. Clasa conine pointer spre double, numrul de rnduri i
de coloane i o variabil codul erorii. S se defineasc constructorul fr parametri
(constructorul implicit), constructorul cu un parametru matrice ptrat i constructorul cu doi
parametri matrice dreptunghiular . a. S se defineasc funciile membru de acces:
returnarea i setarea valorii elementului (i,j). S se defineasc funciile de adunare i scdere a
dou matrice; nmulirea unei matrice cu alta; nmulirea unei matrice cu un numr. S se
testeze funcionarea clasei. n caz de insuficien de memorie, necoresponden a dimensiunilor
matricelor, depire a limitei memoriei utilizate s se stabileasc codul erorii.
Varianta 3
) S se creeze clasa Stack stiv. Cmpurile numrul general i numrul utilizat de elemente
i pointer pentru alocarea dinamic a memoriei. S se defineasc constructorii: implicit, de
copiere i cu parametru numrul necesar de elemente; funciile Push i Pop pentru punerea
unui element pe stiv i scoaterea unui element din stiv respectiv; funciile IsEmpty i IsFull
pentru determinarea strii stivei. Funcia isEmpty returneaz valoarea 1 dac stiva este vid i
zero n caz contrar, iar funcia isFull returneaz valoarea 1 dac stiva este plin i zero n caz
contrar.
b) S se creeze clasa Matrix matrice. Clasa conine pointer spre float, numrul de rnduri i
de coloane i o variabil codul erorii. S se defineasc constructorul fr parametri
(constructorul implicit), constructorul cu un parametru matrice ptrat i constructorul cu doi
parametri matrice dreptunghiular . a. S se defineasc funciile membru de acces:
returnarea i setarea valorii elementului (i,j). S se defineasc funciile de adunare i scdere a
dou matrice; nmulirea unei matrice cu alta; nmulirea unei matrice cu un numr. S se

Programarea n limbajul C++


testeze funcionarea clasei. n caz de insuficien de memorie, necoresponden a dimensiunilor
matricelor, depire a limitei memoriei utilizate s se stabileasc codul erorii.
Varianta 4
) S se creeze clasa File fiier, care conine informaia despre numele complet al fiierului i
anexa de asociere (doc Word, psd Photoshop, etc.), utiliznd memoria dinamic, mrimea,
data i timpul crerii. S se defineasc toi constructorii. Constructorul de schimbare a tipului
are parametrul numele de fiier. S se defineasc funciile de redenumire a fiierului, de
transfer n alt directoriu i de modificare a anexei de asociere.
b) S se creeze clasa Matrix matrice. Clasa conine pointer spre long, numrul de rnduri i de
coloane i o variabil codul erorii. S se defineasc constructorul fr parametri
(constructorul implicit), constructorul cu un parametru matrice ptrat i constructorul cu doi
parametri matrice dreptunghiular . a. S se defineasc funciile membru de acces:
returnarea i setarea valorii elementului (i,j). S se defineasc funciile de adunare i scdere a
dou matrice; nmulirea unei matrice cu alta; nmulirea unei matrice cu un numr. S se
testeze funcionarea clasei. n caz de insuficien de memorie, necoresponden a dimensiunilor
matricelor, depire a limitei memoriei utilizate s se stabileasc codul erorii.
Varianta 5
) S se creeze clasa Document document, care conine informaia despre denumirea, tema,
autorul documentului utiliznd memoria dinamic; numrul de pagini, data i timpul ultimei
redactri. S se defineasc toi constructorii. Constructorul de schimbare a tipului are ca
parametru denumirea documentului. S se defineasc funciile de modificare a temei, datei
ultimei redactri . a.
b) S se creeze clasa Matrix matrice. Clasa conine pointer spre char, numrul de rnduri i
de coloane i o variabil codul erorii. S se defineasc constructorul fr parametri
(constructorul implicit), constructorul cu un parametru matrice ptrat i constructorul cu doi
parametri matrice dreptunghiular . a. S se defineasc funciile membru de acces:
returnarea i setarea valorii elementului (i,j). S se defineasc funciile de adunare i scdere a
dou matrice; nmulirea unei matrice cu alta; nmulirea unei matrice cu un numr. S se
testeze funcionarea clasei. n caz de insuficien de memorie, necoresponden a dimensiunilor
matricelor, depire a limitei memoriei utilizate s se stabileasc codul erorii.
Varianta 6
) S se creeze clasa Image imagine, care conine urmtoarea informaie: denumirea
fiierului, formatul de compresie, dimensiunile imaginii, dimensiunea n octei, compresia (n
%). S se defineasc toi constructorii. Constructorul de schimbare a tipului are ca parametru
denumirea fiierului. S se defineasc funciile de modificare a denumirii de fiier, a
formatului, a dimensiunii . a.
b) S se creeze clasa Matrix matrice. Clasa conine pointer spre Complex, numrul de rnduri
i de coloane i o variabil codul erorii. S se defineasc constructorul fr parametri
(constructorul implicit), constructorul cu un parametru matrice ptrat i constructorul cu doi
parametri matrice dreptunghiular . a. S se defineasc funciile membru de acces:
returnarea i setarea valorii elementului (i,j). S se defineasc funciile de adunare i scdere a
dou matrice; nmulirea unei matrice cu alta; nmulirea unei matrice cu un numr. S se

Programarea n limbajul C++


testeze funcionarea clasei. n caz de insuficien de memorie, necoresponden a dimensiunilor
matricelor, depire a limitei memoriei utilizate s se stabileasc codul erorii.
Varianta 7
) S se creeze clasa Queue coad. Cmpurile numrul de elemente i un pointer pentru
alocarea dinamic a memoriei. S se defineasc constructorii: implicit, de copiere i cu un
parametru numrul necesar de elemente; funciile add i get pentru punerea unui element n
coad i pentru scoaterea unui element din coad respectiv; funciile: isEmpty, care returneaz
valoarea 1 dac coada este vid i zero n caz contrar, i isFull care returneaz valoarea 1 dac
coada este plin i zero n caz contrar.
b) S se creeze clasa Matrix matrice. Clasa conine pointer spre int, numrul de rnduri i de
coloane i o variabil codul erorii. S se defineasc constructorul fr parametri
(constructorul implicit), constructorul cu un parametru matrice ptrat i constructorul cu doi
parametri matrice dreptunghiular . a. S se defineasc funciile membru de acces:
returnarea i setarea valorii elementului (i,j). S se defineasc funciile de adunare i scdere a
dou matrice; nmulirea unei matrice cu alta; nmulirea unei matrice cu un numr. S se
testeze funcionarea clasei. n caz de insuficien de memorie, necoresponden a dimensiunilor
matricelor, depire a limitei memoriei utilizate s se stabileasc codul erorii.
Varianta 8
) S se creeze clasa String ir, utiliznd memoria dinamic. S se defineasc constructorii:
implicit, de copiere i cu un parametru pointer spre un ir de tip char. S se defineasc
funciile de atribuire a unui ir la altul, de comparaie, de cutare a unui subir, de numrare a
simbolurilor . a.
b) S se creeze clasa Matrix matrice. Clasa conine pointer spre double, numrul de rnduri i
de coloane i o variabil codul erorii. S se defineasc constructorul fr parametri
(constructorul implicit), constructorul cu un parametru matrice ptrat i constructorul cu doi
parametri matrice dreptunghiular . a. S se defineasc funciile membru de acces:
returnarea i setarea valorii elementului (i,j). S se defineasc funciile de adunare i scdere a
dou matrice; nmulirea unei matrice cu alta; nmulirea unei matrice cu un numr. S se
testeze funcionarea clasei. n caz de insuficien de memorie, necoresponden a dimensiunilor
matricelor, depire a limitei memoriei utilizate s se stabileasc codul erorii.
Varianta 9
) S se creeze clasa Discipline - disciplin, care conine informaia despre denumirea
obiectului, numele profesorului, numrul de ore la disciplin i forma de susinere (examen sau
colocviu). S se utilizeze memoria dinamic pentru setarea cmpurilor textuale. S se
defineasc constructorii: implicit, de copiere i cu un parametru denumirea disciplinei. S se
defineasc funciile de schimbare: a profesorului, a numrului de ore i a formei de susinere.
b) S se creeze clasa Matrix matrice. Clasa conine pointer spre float, numrul de rnduri i
de coloane i o variabil codul erorii. S se defineasc constructorul fr parametri
(constructorul implicit), constructorul cu un parametru matrice ptrat i constructorul cu doi
parametri matrice dreptunghiular . a. S se defineasc funciile membru de acces:
returnarea i setarea valorii elementului (i,j). S se defineasc funciile de adunare i scdere a
dou matrice; nmulirea unei matrice cu alta; nmulirea unei matrice cu un numr. S se

Programarea n limbajul C++


testeze funcionarea clasei. n caz de insuficien de memorie, necoresponden a dimensiunilor
matricelor, depire a limitei memoriei utilizate s se stabileasc codul erorii.
Varianta 10
) S se creeze clasa Soft fiier, care conine informaia despre numele complet al fiierului i
anexa de asociere (doc Word, psd Photoshop, etc.), utiliznd memoria dinamic, mrimea,
data i timpul crerii. S se defineasc toi constructorii. Constructorul de schimbare a tipului
are parametrul numele de fiier. S se defineasc funciile de redenumire a fiierului, de
transfer n alt directoriu i de modificare a anexei de asociere.
b) S se creeze clasa Matrix matrice. Clasa conine pointer spre long, numrul de rnduri i de
coloane i o variabil codul erorii. S se defineasc constructorul fr parametri
(constructorul implicit), constructorul cu un parametru matrice ptrat i constructorul cu doi
parametri matrice dreptunghiular . a. S se defineasc funciile membru de acces:
returnarea i setarea valorii elementului (i,j). S se defineasc funciile de adunare i scdere a
dou matrice; nmulirea unei matrice cu alta; nmulirea unei matrice cu un numr. S se
testeze funcionarea clasei. n caz de insuficien de memorie, necoresponden a dimensiunilor
matricelor, depire a limitei memoriei utilizate s se stabileasc codul erorii.
Varianta 11
) S se creeze clasa Group grupa, care conine informaia despre codul grupei, specialitatea,
numrul de studeni, curatorul grupei i anul de studii. S se utilizeze memoria dinamic pentru
setarea cmpurilor textuale. S se defineasc: toate tipurile de constructori; funciile de
schimbare a curatorului i a numrului de studeni. S se defineasc funcia de setare a anului
de studii n aa fel, nct valoarea acestui cmp s poat fi mrit i s nu depeasc cifra 5.
b) S se creeze clasa Matrix matrice. Clasa conine pointer spre char, numrul de rnduri i de
coloane i o variabil codul erorii. S se defineasc constructorul fr parametri
(constructorul implicit), constructorul cu un parametru matrice ptrat i constructorul cu doi
parametri matrice dreptunghiular . a. S se defineasc funciile membru de acces:
returnarea i setarea valorii elementului (i,j). S se defineasc funciile de adunare i scdere a
dou matrice; nmulirea unei matrice cu alta; nmulirea unei matrice cu un numr. S se
testeze funcionarea clasei. n caz de insuficien de memorie, necoresponden a dimensiunilor
matricelor, depire a limitei memoriei utilizate s se stabileasc codul erorii.
Varianta 12
) S se creeze clasa Set mulimea numerelor ntregi, utiliznd memoria dinamic. S se
defineasc constructorii: implicit i de copiere. S se defineasc funciile: de adugare a unui
element nou n mulime; de determinare a apartenenei elementului la mulime; de adunare,
scdere i intersecie a dou mulimi.
b) S se creeze clasa Matrix matrice. Clasa conine pointer spre Complex, numrul de rnduri
i de coloane i o variabil codul erorii. S se defineasc constructorul fr parametri
(constructorul implicit), constructorul cu un parametru matrice ptrat i constructorul cu doi
parametri matrice dreptunghiular . a. S se defineasc funciile membru de acces:
returnarea i setarea valorii elementului (i,j). S se defineasc funciile de adunare i scdere a
dou matrice; nmulirea unei matrice cu alta; nmulirea unei matrice cu un numr. S se
testeze funcionarea clasei. n caz de insuficien de memorie, necoresponden a dimensiunilor
matricelor, depire a limitei memoriei utilizate s se stabileasc codul erorii.
8

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