Documente Academic
Documente Profesional
Documente Cultură
C01. Curs 1 PDF
C01. Curs 1 PDF
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 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
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
class IdNumeClasa{
declaratii de date membru;
declaratii/definiții de functii membru;
};
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.
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
};
IdNumeClasa{
…
} idOb1, …, idObN;
sau
IdNumeClasa idOb1, …, idObN;
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;
}
…
};
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.