Sunteți pe pagina 1din 27

Programarea Orientată pe Obiecte (POO)

Prelegere

Definirea claselor.
Funcții speciale Constructor și destructor
SUMAR

1. Generalități POO
2. Definirea claselor
3. Constructori. Tipuri de constructori
4. Destructor
5. Manevrarea dinamica a obiectelor
6. Implementarea tipului de date Array după modelul orientat pe obiect

dr. Silviu GÎNCU


Program

§ Programare structurată
ØStructuri de date + Algoritmi = Program

§ Programare orientată obiect


ØDate + Metode = Obiect

dr. Silviu GÎNCU


Clasă - Obiect
§ O clasa este o implementare a unui tip de date abstract. Ea defineşte atributele şi metodele care
implementează structura de date respectiv operaţiile tipului de date abstract.
§ Obiectul reprezintă o instanță a unei clase.

§ Clasa Bicicletă:
⁃ atribute
⁃ tip cadru
⁃ dimensiunea roții
⁃ număr de viteze
⁃ metode
⁃ accelerează
⁃ frânează
dr. Silviu GÎNCU
Sintaxa definirii unei clase

class <nume clasa>{


[<modificator de acces>:]
§ date
<tip data> <nume_data_ membru>;
[<modificator de acces>:]
§ metode <tip metoda> <nume_metoda>(<lista parametri formali>);
};
dr. Silviu GÎNCU
Protecția datelor și funcțiilor membre
§ private – datele şi funcţiile aflate sub influenţa acestui modificator NU pot fi accesate din afara clasei.
§ protected - datele şi funcţiile aflate sub influenţa acestui modificator nu pot fi accesate din afara clasei,
cu excepția claselor derivate
§ public – datele și funcțiile aflate sub influența modificatorului public, pot fi accesate în afara clasei
class complex{ complex z;
private: z.re = 2.5;
double Im, Re; // Incorect deoarece re este private double
public: d=z.Modulul();
double Modulul(); // corect
};

dr. Silviu GÎNCU


Protecția datelor și funcțiilor membre - exemplu
class Curs{
Curs c;
char *cursId; //vizibilitate privată
c.cursID=””; //inacesibil
public: // vizibilitate - publică
c.nume=”POO”; //acesibil
string *nume;
c.nrCredite=8; //inacesibil
protected: // vizibilitate - protejată
c.modificareNumarCredite (8); //acesibil
int nrCredite;
c.afisareIstoricCurs(); //acesibil
public: // vizibilitate - publică
c.informatiiEvaluariStudenti(); //acesibil
void modificareNumarCredite (int);
c. afisareInformatii(); //inacesibil
void afisareIstoricCurs();
};
void informatiiEvaluariStudenti();
private: // vizibilitate - privată
void afisareInformatii();
}; dr. Silviu GÎNCU
Clase - Definirea metodelor
§ imediat, în interiorul clasei -> metode inline
⁃ definiţie completă (antet + corp), Se realizează pentru metodele simple (3- 5
instrucțiuni)
§ în afara clasei -> prin utilizarea operatorului de rezoluţie ::
⁃ antetul metodei în interiorul clasei, iar corpul metodei în afara clasei

dr. Silviu GÎNCU


Problema 1
Să se implementeze tipul de date timp, care va avea în calitate de date: ora, min și sec, iar în calitate
de metode: inițializare, afișare timp format scurt/lung.
#include<iostream>
void Time::SetTime(int h, int m, int s){
using namespace std;
hour = (h >= 0 && h < 24) ? h : 0;
class Time{
minute = (m >= 0 && m < 60) ? m : 0;
public:
second = (s >= 0 && s < 60) ? s : 0;
void SetTime(int, int, int);
}
void PrintShort();
void Time::PrintShort(){
void PrintLong ();
private: cout << (hour < 10 ? "0" : "") << hour << ":";
int hour; //0-23 cout << (minute < 10 ? "0" : "") << minute;
int minute; //0-59 }
int second; //0-59
}; Silviu GÎNCU
dr.
Problema 1

void Time::PrintLong(){
cout << ((hour == 0 || hour == 12) ? 12 : hour % 12);
cout << ":" << (minute < 10 ? "0" : "") << minute;
cout << ":" << (second < 10 ? "0" : "") << second;
cout << (hour < 12 ? " AM" : " PM");
}
int main(){
Time t; //instantiaza obiectul t de tip Time
t.SetTime(13, 27, 6);
cout << "\n\nOra in format scurt dupa SetTime este ";
t.PrintShort();
cout << "\nOra in format lung dupa SetTime este ";
t.PrintLong();
t.SetTime(99, 99, 99);
cout << "\n\nDupa asignarea valorilor invalide:";
cout<< "\nOra in format scurt: ";
t.PrintShort();
cout << "\nOra in format lung: ";
t.PrintLong();
dr. Silviu GÎNCU }
Obiecte
§ Obiectul reprezintă o instanță a unei clase

§ Declararea obiectelor:
<nume_clasă> <nume_obiect>;

§ Alocarea şi iniţializarea unui obiect


⁃ la declarare
⁃ prin apelul automat al constructor-ului

§ De-alocarea
⁃ la sfârşitul programului/funcţiei
⁃ prin apelul automat al destructor-ului

dr. Silviu GÎNCU


Accesarea componentelor unei clase
§ Componentele clasei sunt accesate: class Carte{
char *titlu; int pret;
⁃ direct – în interiorul metodelor membre ale clasei static int nr;
public:
⁃ prin intermediul operatorului “.” – operatorul este precedat char *getTitlu(){return this->titlu;}
de un obiect int getPret();
};
⁃ prin utilizarea operatorului “->” – operatorul este precedat int Carte::nr=10;
de o referinţă a unui obiect int Carte::getpret(){return pret;}
int main(){Carte c;
⁃ prin utilizarea operatorului “::” – operatorul este precedat de cout<<c.getpret();
numele unei clase
cout<< Carte::nr;
}
dr. Silviu GÎNCU
De la obiecte spre clasă

Obiectul
carte

dr. Silviu GÎNCU


Problema 2
Să se creeze o clasă care să implementeze tipul de date carte, descris pe slide-ul anterior.

class carte{ int main(){


char titlu[40], autor[25], ISBN[20], editura[20]; carte a;
int an_aparitie; a.set();
float pret; char *titlu;
titlu=a.obtine_titlu();
public:
char autor[40];
void set();
strcpy(autor, a.autor); // eroare
void set(char*, char*, char*, char*, int, float); // nu avem acces la câmpul autor
char * obtine_titlu(); }
char * obtine_autor();
void modifica_pret();
void afiseaza_informatii();
} ; dr. Silviu GÎNCU
Inițializarea Obiectelor
§ În cazul datelor de tipuri predefinite de date, este posibilă inițializarea acestora la momentul declarării.
Exemplu:
int x=10;
float a[2]={3,8};
§ În cazul obiectelor, inițializarea la declarare se face prin intermediul unor funcții speciale numite
constructori.
class IdNumeClasa {
IdNumeClasa (<listaParametri>);
};
§ Sintaxa declarării unui constructor IdNumeClasa::IdNumeClasa (<listaParametri>){
//instructiuni
}
dr. Silviu GÎNCU
Funcția specială constructor
§ Constructor – o metodă publică specială:
Ø numele metodei = nume_clasă § Tipuri de Constructori:
Ø fără tip de return (nici măcar void) Ø Impliciți
§ Scop: Ø Cu parametri
⁃ rezervă spaţiu pentru datele membre Ø De copiere
⁃ iniţializează datele membre Ø De conversie
⁃ apelat automat la declararea unui obiect
§ Constructorii pot fi supraîncărcaţi pentru a oferi diverse metode de iniţializare a obiectelor clasei
§ O clasă poate avea mai mulți constructori
§ O clasă poate avea un singur constructor implicit
§ Fiecare clasă conține cel puțin un constructor
dr. Silviu GÎNCU
Constructori impliciți
§ definit de utilizator – constructor ce nu are niciun parametru
§ generat de compilator – daca o clasă nu are niciun constructor definit atunci compilatorul generează
unul automat, fară parametri al cărui corp nu conține nicio instrucțiune
§ constructor cu toți parametri impliciți

class Time {
public:
Time(){hour=minute=second=0;
cout<<“Apel constructor\n”;}

};

Time z; z.PrintLong();
dr. Silviu GÎNCU
Constructori cu parametru
§ cu parametri ce nu iau valori implicite;
§ cu parametri ce iau valori implicite.

class Time { class Time {


… …
public: public:
Time(int h=0, int m = 0, int s= 0){ Time(int h, int m, int s){
hour=h; minute=m; second=s; hour=h; minute=m; second=s;
} //parametri impliciți } //parametri ce nu iau valori implicite

dr. Silviu GÎNCU


Apelul constructorilor

int main(){
Time t1; //toate argumentele implicite
t1 – reprezintă timpul 0:0:0
Time t2(2); //minute și second implicite
t2 – reprezintă timpul 2:0:0
Time t3(21, 34); //second implicit t3 – reprezintă timpul 21:34:0
Time t4(12, 25, 42); //toate valorile specificate t4 – reprezintă timpul 12:25:42
Time t5(27, 74, 99); //toate valorile eronate
}

dr. Silviu GÎNCU


Constructori de copiere
§ definiți de utilizator; class IdNumeClasa {
§ generați de compilator IdNumeClasa (IdNumeClasa &ob);
};
§ primeşte ca argument o referinţă la un obiect din
clasă şi iniţializează obiectul nou creat folosind class Time {
datele conţinute în obiectul referinţă. Pentru …
crearea unui obiect printr-un constructor de Time(Time &t1){
copiere, argumentul transmis trebuie să fie o hour = t1.hour;
referinţă la un obiect din aceeaşi clasă. minute = t1.minute;
second = t1.second;
§ este definit de programator; în caz contrar, }
compilatorul generează un constructor de };
copiere care copiază datele membru cu membru
din obiectul referinţă în obiectul nou creat. Time t1(2,25,30), t2(t1);
t1.PrintLong(); t2.PrintLong();
dr. Silviu GÎNCU
Problema 3

Pentru tipul de dată Data calendaristică se definească o clasă care să conțină toate cele 3 categorii
de constructori descriși.

class Date{ int main(){


public: Date date1, date2(15,9,2018), date3(date2);
Date(){day=month=year=0;} cout << "date1 = "; date1.print();
Date (int a, int b, int c){day=a; month=b; year=c;} cout << "date2 = "; date2.print();
Date (Date const &c){ cout<<"Dupa copierea membru cu membru, date1 = ";
day=c.day; month=c.month; year=c.year;} date1 = date2; date1.print();
void print(); cout<< "Constructorul de copiere, date3 = ";
private: date3.print();
int day, month, year; }
};
void Date::print() {
cout<<day<<"/ " <<month "/ " <<year<<endl;
}

dr. Silviu GÎNCU


Funcția specială destructor
§ Destructor – o metodă publică specială: class CreateAndDestroy{
public:
Ø numele metodei = ~nume_clasă CreateAndDestroy(); //constructor
Ø fără tip de return (nici măcar void) ~CreateAndDestroy(); //destructor
};
§ Scop: CreateAndDestroy::CreateAndDestroy(){
⁃ eliberează resursele de memorie alocate de constructor cout << "Constructorul obiectului "<<endl;
}
§ apelat automat la sfârșitul domeniului de vizibilitate: CreateAndDestroy::~CreateAndDestroy(){
⁃ la sfârşitul programului -> pentru obiectele globale cout << "Destructorul obiectului "<< endl;
}
⁃ la sfârşitul funcţiei -> pentru obiectele locale int main(){
§ Nu are parametri CreateAndDestroy t;
§ O clasă poate avea un singur destructor }

dr. Silviu GÎNCU


Manevrarea dinamica a obiectelor
§ Obiectele, ca și alte tipuri de date ale limbajului C++, pot fi gestionate dinamic prin intermediul
operatoriilor new și delete.
§ De exemplu, prin itermediul instrucțiunii Date *p=new Date(20,10,2021); se realizează rezervarea de
memorie pentru obiectul specificat (Data calendaristică), după care se va apela constructorul
obiectului.
§ Asemănător se poate declara un tablou de obiecte:
Date *d=new Date[10]; se realizează rezervarea de memorie pentru 10 obiecte de tip (Data
calendaristică), după care se va apela constructorul pentru fiecare din cele 10 obiecte.
§ Pentru eliberarea memoriei se va utiliza operatorul delete
⁃ delete p; - pentru un obiect
⁃ delete [] d; - pentru tablou
dr. Silviu GÎNCU
Problema 4
Să se creeze o clasă care să implementeze tipul de date Array (tablou unidimensional) cu metode
corespunzătoare tipului de dată creat

class Array{ Array::Array(Array const &k){


public: if(k.c==0){c=0; t=NULL;} else{
Array(){c=0;t=NULL;} c=k.c; t=new int[c];
Array(int const); for(int i=0;i<c;i++) t[i]=k.t[i];
Array(Array const &); }
~Array(); }
void print(); Array::~Array(){if(c!=0) delete [] t;}
void put_n(int);
private: void Array::put_n(int n){
int *t,c; if(c==0) {c=10; t=new int[c];}
}; for(int i=0;i<c;i++) t[i]=rand()%n;
Array::Array(int const k){ }
c=k; t=new int[c]; put_n(100);
}dr. Silviu GÎNCU
int main(){
void Array::print(){ cout<<"Obiectul a1"<<endl;
if(c==0) cout<<"Vectorul nu contine elemente"<<endl; Array a1; a1.print(); a1.put_n(50); a1.print();
else{ cout<<"Obiectul a2"<<endl;
cout<<"Elementele vectorului: "; Array a2(5); a2.put_n(100); a2.print();
for(int i=0;i<c;i++) cout<<setw(5)<<t[i]; cout<<endl; cout<<"Obiectul a3"<<endl;
} Array a3(a1); a3.print();
} cout<<"Obiectul a4"<<endl;
Array a4(a2); a4.print();
}

dr. Silviu GÎNCU


Teme pentru acasă
§ A învăța și repeta conceptele prezentate în cadrul lecției

§ A depana programele prezentate în cadrul lecției

§ A dezvolta programul de pe slide-ul 14 (clasa carte), cu implementarea


metodelor descrise și după caz completarea cu noi metode

§ A completa clasa Array cu metode de calcul (suma elementelor), metode de


căutare (min, max, etc), ordonare a elementelor, precum și de modificare a
elementelor tabloului

dr. Silviu GÎNCU


Prelegerea următoare

1. Cuvântul cheie „this”


2. Date statice
3. Pointeri la date şi funcţii membre
4. Tablouri de obiecte
5. Funcții friend
6. Clase friend

dr. Silviu GÎNCU

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