Documente Academic
Documente Profesional
Documente Cultură
O funcție template (şablon, generică) este un tipar utilizat de compilator pentru a construi
automat diverse funcţii. Se utilizează pentru implementarea de funcţii care diferă doar prin tipul
parametrilor
Sintaxă:
template <par1, par2,..., parN>
antet_functie;
unde:
par1,…,parN sunt parametrii funcției template, de regulă constante sau tipuri de date
specificate prin cuvântul cheie class sau typename.
Important: Toţi parametrii din lista parametrilor şablonului (template) trebuie să apară în lista de
parametri formali ai funcţiei template.
sau
Important: Generarea de cod pentru entitatea template are loc la compilare. La apelul funcţiei
parametrizate, tipul argumentelor determină care versiune a şablonului este folosită.
Exemplu:
In locul funcțiilor
1
Programare orientată pe obiecte Curs 6
putem folosi
template<typename T>
T maxim(T x,T y){
if(x<y)return y;
return x;
}
O clasă template (generică) este un model (un şablon) utilizat pentru generarea unor clase
concrete, clase ce diferă prin tipul anumitor date membre.
Sintaxă:
template < par1, par2,..., parN > declarare_clasă;
unde
par1, par2,..., parN sunt parametrii clasei template, de regulă constante sau tipuri de
date specificate prin cuvântul cheie class sau typename.
unde tipC1, tipC2,...,tipCn sunt tipuri concrete sau constante utilizate pentru a genera
versiunea corespunzătoare de funcție.
Exemplu:
class Complex{
double re, im;
public:
Complex(double re=0, double im=0){
this->re=re;
this->im=im;
}
int operator<(const Complex& c){
return re<c.re && im<c.im;
}
friend ostream& operator<<(ostream& out, const Complex& z){
if(z.re==0)out<<z.im<<(z.im?"i":"");
else if(z.im==0)out<<z.re;
else out << z.re<<(z.im>0?"+":"")<<z.im<<"i";
return out;
}
};
2
Programare orientată pe obiecte Curs 6
class Persoana {
protected:
char *nume;
public:
Persoana(char *nume="") {
this->nume = new char[strlen(nume)+1];
strcpy(this->nume, nume);
}
virtual ~Persoana() {
if (nume){
delete []nume;
nume = 0;
}
}
};
3
Programare orientată pe obiecte Curs 6
void main(void) {
Stiva<char,10> S1;
S1.push('a');
S1.push('f');
S1.pop();
cout << S1.top() << endl;
Stiva<Student,5> S2;
S2.push(Student("Popescu","Matematica"));
S2.push(Student("Alexandrescu","Drept"));
Stiva<Complex,10> S3;
S3.push(Complex(1,2));
}
În exemplul precedent se observă cum folosind o clasa tip șablon am putut crea trei stive S1, S2,
S3 cu elemente diferite. În clasa Student, lipsa supraîncărcării operatorului = ar fi condus la o
eroare in timpul rulării.
4
Programare orientată pe obiecte Curs 6
Diagrame UML
UML( Unified Modeling Language) este un limbaj vizual de modelare utilizat pentru specificarea,
construirea şi documentarea sistemelor de aplicaţii orientate obiect şi nu numai.
O diagrama UML este o prezentare grafică ale unui set de elemente, cel mai adesea exprimate ca
un graf de noduri (elementele) și arce (relațiile).
Diagramele de clase sunt folosite în modelarea orientată obiect pentru a descrie structura statică a
sistemului, modului în care este el structurat. Se oferă o notaţie grafică pentru reprezentarea
claselor (entităţi ce au caracteristici comune) și relațiilor (relațiile dintre două sau mai multe
clase).
IdClasa
vizibilitate idAtribut
vizibilitate idAtribut: tip
vizibilitate idAtribut:
tip=valoare_implicita
vizibilitate idMetoda
vizibilitate
idMetoda(lista_param):tip_returnat
Specificarea Atributelor
Sintaxa:
vizibilitate idAtribut : tip = valoare_implicitia
unde:
vizibilitate reprezintă protecția atributului și poate să aibă una din următoarele valori
+ - public
- - privat
# - protected (opțional)
5
Programare orientată pe obiecte Curs 6
Specificarea Metodelor
Sintaxa:
vizibilitate idMetoda(idP1:tip1, ..., idPn:tipN) : tip_returnat
unde:
vizibilitate reprezintă protecția atributului și poate să aibă una din următoarele valori
+ - public
- - privat
# - protected (opțional)
idMetoda este identificatorul metodei
idP1,..., idPn sunt parametrii metodei
tip1, ..., tipN sunt tipurile parametrilor
tip_returant reprezintă tipul valorii returnate de metodă
6
Programare orientată pe obiecte Curs 6
Clasă
Moştenirea este o relaţie prin care se indică faptul că o clasă moşteneşte caracteristicile clasei
părinte. În plus, clasa copil poate avea propriile caracteristici.
Asocierea arată existenţa unei relaţii între clase. În exemplul de mai jos, între Persoană şi
Autovehicul există următoarea relaţie:
o Persoană poate avea zero, unul sau mai multe Autovehicule.
În exemplul de mai jos, relaţia dintre Articol şi Lista de preţuri este de tip mai mulţi la mai mulţi:
un Articol poate să apară pe mai multe Liste şi o Listă poate avea mai multe Articole. Pe Liste
diferite Articolele pot avea preţuri diferite.
7
Programare orientată pe obiecte Curs 6
Dependenţa indică faptul că o clasă depinde de altă clasă, în sensul în care o funcţie oarecare
depinde de un parametru al său.
Agregarea indică faptul că o clasă părinte are elemente de tipul clasei copil. În exemplul de mai
jos Ţara poate avea mai multe Judeţe dar, în acelaşi timp, un Judeţ poate exista chiar şi în cazul în
care clasa Ţara nu există.
Într-o relaţie de tip compoziţie clasa copil nu poate exista decât dacă există o instanţă a clasei
părinte. În exemplul de mai jos instanţa clasei Comisie există atâta timp cât există instanţa clasei
Examen.
8
Programare orientată pe obiecte Curs 6
Tratarea excepțiilor
În cazul apariției unei erori se poate afișa eroarea propriuzisă și apoi se continuă execuția sau se
termină programul după afișare. În limbajul C tratarea erorilor se făcea folosind assert. In C++
tratarea excepțiilor se face folosind try, throw şi catch. Tratarea excepţiilor în C++ este o metodă
care se aplică atunci când funcţia care detectează o eroare nu o şi tratează. Ea doar generează sau
aruncă excepţia (throw). Aruncarea unei excepții nu garantează că excepţia va fi şi tratată în afara
funcţiei. Pentru aceasta, trebuie specificată o secvenţă de cod care detectează sau prinde excepţia
şi o tratează. Programatorul trebuie să includă într-un bloc try codul care ar putea genera o eroare
generatoare a unei excepţii. Blocul try este urmat de unul sau mai multe blocuri catch. Fiecare
bloc catch specifică tipul excepţiei pe care o poate detecta și va executa blocul corespunzator
tipului excepției.
Excepţiile sunt interceptate şi prelucrate folosind construcţia try şi catch, care are sintaxa:
try{
//codul care ar putea genera erori
}
catch(Tip1 Var1){
//tratare exceptie
}
...
catch(Tipn VarN){
//tratare exceptie
}
Fiecare bloc catch are între paranteze rotunde tipul de excepţie care va fi interceptat şi prelucrat de
blocul de instrucţiuni.
Important: Blocurile try şi catch formează o singură construcţie (nu se poate folosi un bloc try
fără cel puţin un bloc catch şi nu se poate folosi un bloc catch fără un bloc try). Între cele două
blocuri nu pot exista alte secvenţe de instrucţiuni. Se pot înlănţui oricâte blocuri catch, câte unul
pentru fiecare tip de excepţie ce se doreşte a fi tratată.
9
Programare orientată pe obiecte Curs 6
Exemplu
void main(void){
cout << "Start" << endl;
try {
cout << "Exemplu tratare exceptii." << endl;
throw 100;//lansam o exceptie
cout << "Cod care nu se va executa.";
}
catch(int i) {
cout << "Am captat exceptia care are codul: "<< i << endl;
}
cout << "Stop" << endl;
}
Exemplu
Fie funcţia:
void main(){
cout<<"Start test exceptii"<<endl;
cout<<"n!="<<factorial(-5)<<endl;
cout<<"Sfarsit test exceptii"<<endl;
}
În acest caz ajungem la o terminare anormală a programului. Mesajul "Sfarsit test exceptii" nu
mai apare. Execuţia se întrerupe în momentul apariţiei excepţiei.
void main(){
cout<<"Start test exceptii"<<endl;
try{
cout<<"n!="<<factorial(-5)<<endl;
}
catch(char* p){
cout<<p<<endl;
}
catch(int){
cout<<"O alta exceptie";
}
cout<<"Sfarsit test exceptii"<<endl;
}
10
Programare orientată pe obiecte Curs 6
La tratarea excepțiilor pot fi folosite și clase de excepții (în locul tipurilor standard). Aceste clase
pot fi definite de utilizator sau pot fi dintre cele standard.
Exemplu:
class Vector{
static const int DMAX=100;// dimensiune maxima vector
float* v;
int d; // numar de elemente vector
public:
class Range{}; // clase exceptii
class Size {};
Vector(int n);
float& operator[](int i);
};
Vector::Vector(int n){
if(n < 0 || n >= DMAX)
throw Size();
d = n;
v = new float[n];
};
11
Programare orientată pe obiecte Curs 6
void main(){
try{
Vector v(200); // declanseaza exceptia Size
v[130] = 1.3; // declanseaza exceptia Range
}
catch(Vector::Size){
cout<<"Depasire dimensiune maxima admisa"<<endl;
}
catch(Vector::Range){
cout<<"Depasire limite tablou"<<endl;
}
}
Clasele de excepţii formează o ierarhie bazată pe clasa exception. Această ierarhie poate fi folosită
pentru simplificarea tratării erorilor.
Important: Dacă dorim să captăm orice excepție putem folosi blocul catch(...).
Sintaxă
try{
//codul care ar putea genera erori
}
catch(Tip1 Var1){
//tratare exceptie
}
...
catch(Tipn VarN){
//tratare exceptie
}
catch(…){
// captraza orice exceptie
}
Nu este încurajată utilizarea blocului catch(...) deoarece se pierde orice informaţie despre excepţia
apărută.
12