Sunteți pe pagina 1din 9

Programare orientată obiect Curs 1

PROGRAMARE ORIENTATĂ OBIECT

Noțiuni introductive
Tehnici de programare
 Programarea nestructurată
Specifică programelor simple, de mici dimensiuni care conțin o singură metodă.
Programul devine greu de gestionat pe măsură ce codul devine mai lung .

 Programarea procedurală
Se bazează pe noţiunea de procedură (funcţie). Programul devine greu de gestionat cand
se lucrează cu un număr mare de stucturi de date şi algoritmi care prelucrează datele.

 Programarea modulară
Programele sunt partiţionate astfel încât datele să fie ascunse în module (data hiding
priciple). Este permisă reutilizarea modulelor, modulele odată create putând fi incluse în
alte aplicații. Ușurează lucrul în echipă și permite o mai bună organizare și structurare a
codului sursă.

 Abstractizarea datelor
Realizarea de tipuri de date definite de utilizator care se comportă ca şi tipurile default
(build-in) (Abstract Data Types).

 Programarea orientată obiect (POO)


Eeste o metodă de proiectare și implementare în care programele sunt reprezentate sub
forma unor colecții de obiecte care interacționează între ele. În practică trebuie să se
decidă ce clase sunt necesare, trebuie proiectat cate un set complet de operaţii pentru
acestea, trebuie explicitate părţile comune ale lor prin relaţia de moştenire (derivare,
generalizare) şi trebuie folosit polimorfismul.
Diferențele dintre module și clase:
o clasele pot fi instanțiate pentru a crea obiecte
o clasele pot moștenii date și metode de la alte clase
o polimorfismul permite ca relațiile dintre instanțele claselor să se schimbe la
rulare, pe când relațiile dintre module sunt statice.
Asemănările dintre module și clase:
o Pot fi utilizate pentru a ascunde detaliile de implementare
o Ambele pot forma ierarhii.
Limbaje de programare orientate obiect: C++, C#, Java, …

 Programarea generică
Algoritmii devin independenţi de detaliile de reprezentare. Algoritmii se parametrizează
astfel încât să funcţioneze cu o mulţime de date şi structuri de date potrivite.

1
Programare orientată obiect Curs 1

Concepte de bază în POO


 Abstractizarea - capacitatea de a reprezenta concepte direct într-un program și de a
ascunde detaliile din spate (se oferă clase şi obiecte).

 Încapsulare - capacitatea de a oferi garanții că o abstractizare este utilizată numai în


conformitate cu specificațiile sale.

 Modularitatea- Modalitate de a grupa abstractizări legate logic între ele.

 Polimorfism - capacitatea de a oferi aceeași interfață pentru obiecte cu implementari


diferite. Conduce la simplificarea codului folosind abstracțiuni.

 Moştenirea - posibilitatea de a construi noi abstractizări pornind de la una deja existentă.


Este una dintre cele mai puternice moduri de construcție de abstracțiuni utile.

 Genericele- capacitatea de parametrizare a tipurilor și funcțiilor prin tipuri și valori, fiind


un instrument puternic pentru a scrie algoritmi generali.

Clase și obiecte
 O clasă descrie unul sau mai multe obiecte ce pot fi precizate printr-un set uniform de
atribute(date) şi metode(funcţionalitate).
 Orice obiect are memoria sa proprie unde se păstrează valorile tuturor atributelor sale
 Orice obiect are un tip
 Un obiect este o instanţă a unei clase
 Clasa defineşte caracteristicile și comportarea obiectelor
 Definirea unei clase presupune:
o combinarea datelor cu operaţiile ce se aplică acestora
o ascunderea informaţiei

Sintaxa definirii unei clase


Definirea unei clase constă din două părţi distincte:
o declararea clasei
o implementarea clasei
Sintaxa

class IdNumeClasa{
declaratii de date membru;
declaratii/definiții de functii membru;
};

Protecția datelor și funcțiilor membre


Funcţiile şi datele unei clase pot fi grupate din punct de vedere al dreptului de acces în:
2
Programare orientată obiect Curs 1

 private – conţine date şi funcţii membre care pot fi folosite doar de către celelalte funcţii
aparţinând clasei respective;
 protected – similară cu private dar care dă drepturi de acces şi funcţiilor membre ale
claselor derivate din clasa respectivă
 public – drept de acces tuturor

Important
Prin utilizarea corectă a specificatorilor de acces private, protected, public:
 Modul de structurare a datelor nu este cunoscut: datele sunt declarate intr-o secţiune
“privată” a clasei.
 Accesul la date, pentru consultare, modificare, etc. se face numai prin intermediul funcţiilor
clasei, acestea declarandu-se intr-o secţiune “publică” a clasei.
 Pot exista date “publice” precum si funcţii “private”, decizia fiind a programatorului.

Declararea datelor

class IdNumeClasa{
tip idNumeData1[=exp1],idNumeData2[=exp2],…,idNumeDataN[=expN];
};

unde “tip” reprezintă un tip de date, IdNumeData1, IdNumeData2, ..., IdNumeDataN reprezintă
denumiri valabile de variabile iar exp1, exp2, ...,expN reprezintă expresii ce se evaluează și a căror
valoare este atribuită la declarare variabilelor corespunzătoare.

Declararea/definirea unei metode

Declarare
class IdNumeClasa{
tip idNumeMetoda(tip1 p1, …, tip pn);
};

Definire
tip IdNumeClasa:: tip idNumeMetoda(tip1 p1, …, tip pn){
//instructiuni
}

Exemplu

class ContBancar{
private:
char titular[100];
char codIBAN[25];
float sold;

public:
void init(char titular[], char codIBAN[], float _sold);
void depune(float suma);
void retrage(float suma);
float getSold();
void afisare();

3
Programare orientată obiect Curs 1

};

Sintaxa declararii unui obiect

IdNumeClasa{

} idOb1, …, idObN;

sau
IdNumeClasa idOb1, …, idObN;

Referirea la datele si metodele membru

idOb.idDataMembru
idPointerOb ->idDataMembru
idOb.idMetodaMembru(lista de parametri);
idPointerOb ->idMetodaMembru(lista de parametri);

Exemplu

int main(){
ContBancar c;
c.init("Apetrii","RO51BRDE0080005630670001", 500);
c.afisare();
c.depune(10);
c.afisare();
}

Inițializarea Obiectelor
În cazul obiectelor, inițializarea la declarare se face prin intermediul unor funcții speciale numite
constructori. Un constructor este o funcție membră specială, cu același nume cu al clasei și se
apelează în mod automat la crearea unui obiect. Rolul constructorului este acela de alocare și
inițializare.

Caracteristicile constructorilor
 au același nume cu cel al clasei din care fac parte
 nu returnează nimic (nici macar tipul void)
 o clasă poate avea mai mulți constructori
 nu pot primi ca parametri instanțe ale clasei ce se definește, ci doar pointeri sau referințe la
instanțele clasei respective
 constructorii nu sunt apelaţi explicit (in general)
 constructorii nu se moștenesc
 constructori nu pot fi funcții virtuale

Sintaxă
Declarare:
class IdNumeClasa {
...
4
Programare orientată obiect Curs 1

IdNumeClasa (<listaParametri>);
...
};

Definire:
IdNumeClasa::IdNumeClasa (<listaParametri>){
//instructiuni
}

Inițializarea obiectelor:
IdNumeClasa idObiect(<listaParametri>);
sau
IdNumeClasa idObiect = valParam; //in cazul in care lista de
parametri e formata dintr-un singur parametru

Exemplu

Declarare:
class Complex {
private:
float re;
float im;
public:
Complex(float r, float i);
void citire();
void afisare();
float modul();
};

Definire
Complex::Complex(float re, float i){
this->re = re;
im = i;
}
void Complex::citire(){
cout<<"Dati partea reala:";
cin>>re;
cout<<"Dati partea imaginara:";
cin>>im;
}
void Complex::afisare(){
cout<<re<<"+"<<im<<"*i";
}
float Complex::modul(){
return sqrt(re*re + im*im);
}

Referire:
Complex z,z1(7,3);
z.re = 2.5; // Incorect deoarece re este private
z.citire();
Complex *p=&z;
p -> afisare();

5
Programare orientată obiect Curs 1

Tipuri de constructori

 Constructori impliciți
o definit de utilizator – constructor ce nu are niciun parametru
o generat de compilator – daca o clasă nu are niciun constructor definit atunci
compilatorul genereazăunul automat, fară parametri al cărui corp nuconține nicio
instrucțiune
o constructor cu toți parametri impliciți

Exemplu

class Complex {

public:
Complex(){
re = 0;
im = 0;
}

};

Complex z;

 Constructori cu parametri
o cu parametri ce nu iau valori implicite
o cu parametri ce iau valori implicite (la apel, aceștia pot sa lipsească, caz în care ei au
valorile implicite specificate la declarare).

Exemplu

class Complex {

public:
Complex(float re,float im=0){ // im este parametru cu valoarea implicita 0
this->re = re; // „this” reprezinta un pointer catre obiectul curent
this->im = im;
}

};

Complex z1(2),z1(3,-5);

class Persoana {
private:
char *nume;
int varsta;
public:
Persoana(char *n, int v){
nume = new char[strlen(n)+1];

6
Programare orientată obiect Curs 1

strcpy(nume, n);
varsta = v;
}
};

 Constructori de copiere
o permit iniţializarea obiectelor din altele deja existente
o Sunt definiți de utilizator și generați de compilator

Sintaxă:
class IdNumeClasa {
. . .
IdNumeClasa (IdNumeClasa &ob);
sau
IdNumeClasa (const IdNumeClasa &ob);
. . .
};

Utilizare:
o Crearea de obiecte cu iniţializare, pornind de la un obiect care există
IdClasa ob2=ob1ș
o Apelul unei funcţii care lucrează cu obiecte transferate prin valoare, când este
nevoie de crearea unei copii a obiectului pe stivă
f(ob);
o Returnarea dintr-o funcţie a unui obiect prin valoare
return ob;

Exemplu

class Complex {

public:
Complex(const Complex &z){
re = z.re;
im = z.im;
}

};

void f(Complex z){



}

Complex z1(2,3);
Complex z2 = z1;
f(z1);

class Persoana {

Persoana(const Persoana &p){
nume = new char[strlen(p.nume)+1];
strcpy(nume, p.nume);
varsta = p.varsta;

7
Programare orientată obiect Curs 1

}

};


Persoana p1("Marius",22);
Persoana p2=p1;

Destructori

Destructorul este o funcție membră specială a unei clase ce apelează în mod automat distrugerea
unui obiect. Este definit de utilizator si generat de compilator, avand rolul de a elibera zonele
alocate dinamic.

Sintaxă
class IdNumeClasa {
...
~IdNumeClasa ();
...
};

IdNumeClasa::~IdNumeClasa (){
//instructiuni
}

Caracteristici
 Are același nume cu numele clasei si este precedat de ~
 Nu are parametri
 Nu returneaza nimic (nici macar void)
 O clasa poate avea un singur destructor
 Pot fi functii virtuale

Exemplu
class Complex {

public:
void ~Complex(){
cout<<“Distrugere obiect:”;
afisare();
}

};

void main(){
Complex z1(2,3), z2(4,7);
z1.afisare();
z2.afisare();
}

class Persoana {
...
~Persoana(){
cout<<"Distrug obiectul:"<<nume<<endl;
8
Programare orientată obiect Curs 1

delete nume;
}
};

int main(){
Persoana p1("Marius",35);
Persoana p2=p1;
p1.afisare();
p2.afisare();
}

Temă
 Implementați clasa NumarRațional.

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