Sunteți pe pagina 1din 28

Programare Obiect Orientata (POO)

Curs: prof. dr. ing. Ovidiu GRIGORE


sala: B319a / B 134
tel: 021 402 4897
e-mail: ovgrig@yahoo.com
url: ai.pub.ro/~ovidiu
Laborator:
conform orarului
colocviu in ultimile 2 sedinte
ordine alfabetica)

(1/2 grupa in

POO Introducere. Chestiuni administrative

Notare:
Semestru: lucrare verificare (sapt. 7/8)
30 pt.
colocviu laborator (practic)
30 pt.
LUCRARILE NU SE REFAC / REPETA
Sesiune:

examen (scris)

Nr. Credite: 4

40 pt.

POO Introducere. Chestiuni administrative

Bibliografie:
F. Ionescu, Elemente de programare orientata pe obiecte,
Ed. Printech, Bucuresti,2000;
D. Somnea, D. Turturea, Initiere in C++, Ed.Tehnica,
Bucuresti, 1993;
L. Negrescu, Limbajele C si C++ pentru incepatori, Editura
MicroInformatica, Cluj, 1998.

Surse internet:
http://ai.pub.ro/content/POO.htm
Conventie definire nume in C++
http://geosoft.no/development/cppstyle.html

POO Recapitulare C. Introducere notiuni C++

Recapitulare C. Introducere notiuni C++


Afisarea unui mesaj din C este valabila si in C++
#include <stdio.h>
void main()
{
printf(Mesaj de afisat\n);
}

Alternativa in C++
#include <iostream.h>
void main()
{
cout<<Mesaj de afisat<<endl;
}

In aceasta forma cele 2 solutii NU difera foarte mult

POO Recapitulare C. Introducere notiuni C++

Diferentele apar in utilizarea afisarii valorilor variabilelor


Sintaxa in C (valabila si in C++) utilizeaza specificatori de format
#include <stdio.h>
void main()
{
int a=10, b=15;
printf(a= %d
b= %d \n,a,b);
}

Alternativa in C++, (fol. op. bibl. iostream), se simplifica


#include <iostream.h>
void main()
{
int a=10, b=15;
cout<<a= <<a<<
}

b=<<b<<endl;

POO Recapitulare C. Introducere notiuni C++

Obs.: a) cout este echivalentul stdout din C (dispozitivul


standard de iesire);
b) << este un operator binar (ca de ex.: a + b) in care continutul
operandul drept este transferat operandul stang (cout )
Sintaxa:

cout << OperandDrept

c) cout este un obiect definit din clasa ostream


oarecum echivalent cu
variabila definita din tipul de date ostream

POO Recapitulare C. Introducere notiuni C++

In mod similar, pentru introducerea datelor se poate folosi:


functia scanf ca in C sau
operatorul >> al obiectului cin din clasa istream
Sintaxa C si C++

Sintaxa C++

#include <stdio.h>

#include <iostream.h>

void main()
{
int a;
scanf(%d,&a);
printf(a= %d \n,a);
}

void main()
{
int a;
cin>>a;
cout<<a= <<a<<endl;
}

POO Recapitulare C. Introducere notiuni C++

Tipuri de date
Limbajul C++ preia de la limbajul C tipurile de date, la care
adauga altele tipuri sau le modifica/nuanteaza/flexibilizeaza pe
unele dintre ele, dupa caz.

Tipuri de date fundamentale (de baza)


char
int
float
double

care pot fi afectate (domeniu/semn/precizie) de modificatorii de tip


unsigned
signed
short
long

POO Recapitulare C. Introducere notiuni C++

Tipuri de date derivate


tipuri predefinite
pointeri
tablouri

tipuri definite de utilizatori


structuri
uniuni

Structura colectie de variabile cu tipuri de date diferite/la fel care


sunt incapsulate (integrate) intr-o aceeasi entitate (tip
de date), careia i se atribuie un nume (identificator)
Sintaxa definire:

struct nume
{ TipDate1 v1;
TipDate2 v2;
............
};

Operatori:
.

->

POO Recapitulare C. Introducere notiuni C++

Exemplu:
struct Persoana
{ char nume[20];
int an_nastere;
char adresa[50];
}

Obs.: Numele tipul de date nou creat, care va fi mentionat de


oricate ori este nevoie apelarea sa, este:
in C
struct Persoana

in C++
Persoana

Deci, sintaxa pt. declararea unei variabile din noul tip de date este:

in C
struct Persoana v1;

in C++
Persoana v1;

POO Recapitulare C. Introducere notiuni C++

Exemplu:

struct NrComplex
{
double re;
double im;
}

Obs.: Pt. var. de tipul NrComplex se vor defini functii de


prelucrare strict legate de acest tip de date (adunare, inmultire,
conjugat, etc.). Aceste functii nu se pot aplica altor tipuri de date
(int, Persoana), astfel ca ar fi o idee buna sa le legam de tipul
de date caruia li se aplica. Apare astfel ideea largirii/generalizarii
notiunii de strucutura in care sa fie incapsulate pe langa
variabile si functii de prelucreare.
clasa tip abstract de date definit de utilizator, care incapsuleaza
atat date (variabile), dar si metode (functii, operatori) de prelucare
legate de acest tip de date.

POO Recapitulare C. Introducere notiuni C++

Exemplu: Comparatii
struct Data1
{
int i1;
double d1;
};

class Data2
{
int i1;
double d1;
};

int main()
{
struct Data1 a;

int main()
{
Data2 b;

a.i1=3;
a.d1=5.7;

b.i1=3;
b.d1=5.7;

EROARE compilare

Nu avem acces la datele membre i1 si d1

POO Recapitulare C. Introducere notiuni C++

De ce apare eroarea???
In spiritul generalizari/flexibilizarii tipului de date structura, in C++
datelor membre ale unei clase (dar si ale unei structuri) pot avea
grade de acces diferite. Astfel, ele pot fi declarate:
public
pot fi accesate (modificate/citite) din exteriorul tipului de date
private pot fi accesate (modificate/citite) numai din interiorul tipului de date
protected

In mod implicit (cand nu este specificat explicit de programator) tipul de


acces la datele membre ale unei:
clase este private
structura este public

POO Recapitulare C. Introducere notiuni C++

Prin urmare, datele membre ale unei clase avand tip de acces implicit
(private) NU pot fi accesate din exteriorul clasei. Pentru a le
accesa trebuie declarate in mod explicit cu tipul de acces public
class Data2
{ public:
int i1;
double d1;
};

Astfel se corecteaza eroarea


anterioara, programul se
compileaza / executa corect

Obs.: In general, datele membre ale unei clase sunt declarate private
pentru a beneficia de unul dintre avantajele tehnologiei POO, numit
mecanism de protejare a datelor sau ascunderea datelor (data
hiding), conform caruia blocarea accesului din exteriorul clasei
(structurii) conduce la evitarea alterarii (modificarea
nedorita/neglijenta/accidentala) a valorilor stocate in datele
membre.

POO Recapitulare C. Introducere notiuni C++

Evident, daca toate datele membre sunt declarate private, NU mai


exista acces la acestea, deci NU se mai pot transfera valori: date de
intrare dinspre exterior catre clasa sau rezultate de la clasa catre
exterior.

Aplicatie
clasa1
{ date,
metode
}
functie2()
{
functie1()
} {
main()
} {
}

clasa3
{ date,
clasa2
metode
{ date,
}
metode
}

POO Recapitulare C. Introducere notiuni C++

Dar, scopul oricarei aplicatii este de a prelucra datele, iar pentru aceasta
trebuie sa avem posibilitatea sa facem schimb de date intre partile
aplicatiei. Prin urmare trebuie sa asiguram accesul la date prin alta
metoda = definire functiilor de acces la date (functii de interfata)

clasa1
{ date,
metode
}

Functii
Interfata

Aplicatie

functie2()
{
functie1()
} {
main()
} {
}

clasa3
{ date,
clasa2
metode
{ date,
}
metode
}

POO Recapitulare C. Introducere notiuni C++

Exemplu:
class Data2
{
int i1;
double d1;
public:
int get_i1() { return i1;};
double get_d1() { return d1;};
void set_i1(int i1_) {i1=i1_};
void set_d1(double d1_) {d1=d1_};
};
int main()
{
Data2 c;
c.set_i1(3);
c.set_d1(5.7);
cout<<c.i1=<<c.get_i1()<<c.d1=<<c.get_d1();
}

POO Recapitulare C. Introducere notiuni C++

Obs.: Functiile membre (la fel ca si datele membre) pot avea diferite
tipuri/grade de acces:
public, private, protected, friend

Astfel, se rezolva problema accesului la datele membre, insa NU avem


posibilitatea sa initializam datele la declarere (pentru ca sunt
private, ascunse).
Amintim, in C se face initializarea unei structuri la declararea variabilei
cu sintaxa:
struct Data1 var1={1,3};

Echivalenta cu:
struct Data1 var1;
var1.i1=1;
var1.d1=3;

POO Recapitulare C. Introducere notiuni C++

In C++, pentru initializarea unui obiect (variabila) la declarare se


foloseste o functie speciala, numita constructor, care se apeleaza
imediat dupa ce un obiect a fost creat.
Numele constructorului este identic cu al clasei.
Exemplu:

class Data3
{
int i1, i2;

public:
Data3(int v1,int v2)
{
i1=v1;
i2=v2;
}
};

Initializarea la declarare se face cu sintaxa:


int main()
{
Data3 a(1,2);
. . . . . .
}

POO Caracterisiticile modelului obiect (POO)

Caracterisiticile modelului obiect (POO)


Abstractizare crearea unui concept in care sa se identifice trasaturile
esentiale ce caracterizeaza entitatile similare din lumea reala
(situatii / procese / obiecte matematice, notiuni fizice, etc.).
Trasaturile pot fi la nivel structural (valoric) si/sau
comportamental (de prelucrare). D.p.v al POO o abstractizare
(concept) se implementeaza printr-o clasa
Exemplu: Daca avem de prelucrat figuri geometrice 2-dim., se observa ca exista o
submultime, Poligon, care au trasaturi structurale (nrVf, {coordonateVf}), si
procedurale (calcPerimetru) comune deci i se poate asocia un concept,
implementabil printr-o clasa:

class Poligon
{
int nrVf;
pct2D *coordonateVf;
public:
double calcPerimetru();
. . . . . . . . . . . . . . . . . . . .

};

Tema:
1. Sa se abstractizeze
notiunile: matrice,
vector
2. def. tipului de date
pct2D
3. def. constructorului
Poligon(int nVf)

POO Caracterisiticile modelului obiect (POO)

Incapsulare organizarea unitara (pastrarea la un loc) a trasaturilor


ce definesc un concept si in acelasi timp separarea acestora: la
nivel structural (valoric, date) si comportamental (procedural,
metode de prelucare).
separarea continutului (interior) conceptului (clasa)
de restul entitatilor (exterior = aplicatie).
Protejarea /ascunderea datelor (data hiding)
incapsulare + dif. tip de acces = limitarea accesului la
componentele interne ale clasei
Accesul la datele protejate functii de interfata

POO Caracterisiticile modelului obiect (POO)

Tipizare Tipul este asociat unei clase implicit (prin definitie).


Se doreste accentuarea caracterului puternic tipizat al clasei
(POO); clasa ca tip de date impune si modul de prelucrare al
datelor (motiv pentru care, de ex. , nu se pot face implicit
operatii cu obiecte din clase diferite). Orice prelucrare
(operatie, functie) cu obiecte dintr-o clasa sau cu obiecte din
clase diferite trebuie definita in mod explicit. (In general
aceasta este un avantaj, pentru ca orice prelucrare este strict
administrata/definita de utilizator, nu pot aparea erori, confuzii
de conversii de tip).
Exemplu: In C se pot aduna variabile de tipuri
diferite posibila sintaxa (se efect. cast implicit):
int main()
{ int a=2;
double b=3.5,c;

In C++ se pot aduna obiecte din clase


diferite? NU
int main()
{ Clasa1 a;
Clasa2 b,c;

c=a+b;
}

c=a+b;
}

POO Caracterisiticile modelului obiect (POO)

Ierarhizarea modalitate de a organiza abstractizarile (clasele


asociate) intr-o structura ierarhizata (arbore/graf): relatii
de subordonare / includere si relatii de echivalenta
ierarhica (clasele de aceeasi importanta au acelasi nivel
de ierarhizare).

Organizarea conceptelor de la nivelul de generalizare


maxima catre nivelul de detaliu maxim.
pune in evidenta relatii de agregare sau relatii intre tipuri de date
Relatiile de agregare = specifica compunerea unui
entitati complexe din mai multe entitati mai simple

POO Caracterisiticile modelului obiect (POO)

Exemplu: Revenire la problema Poligon={triunghi,dreptunghi,patrat}


class Poligon
{
int nrVf;
pct2D *coordonateVf;
public:
Poligon(int nVf){nrVf=nVf;};
double calcPerimetru();
- - - - - - - - - - - - - - - - - - - - - - - - -

};

class Triunghi:public Poligon


{
public:
Triunghi():Poligon(3){};
double calcArie();

class Dreptunghi:public Poligon


{
public:
Dreptunghi():Poligon(4){};
double calcArie();

- - - - - - - - - - - - - - - - - - - - - - - - -

};

- - - - - - - - - - - - - - - - - - - - - - - - -

};

class Patrat:public Dreptunghi


{
public:
Patrat():Dreptunghi(){};
- - - - - - - - - - - - - - - - - - - - - - - - -

};

POO Caracterisiticile modelului obiect (POO)

Ierarhizarea Relatiile intre tipuri de date sunt definite prin


mostenirile ntre clase, prin care o clasa (clasa derivata)
preia structura (datele) sau/si comportarea (metode de
prelucrare) definita n alta clasa (clasa de baza )
Derivarea claselor Implementarea ierarhizarii de la nivelul
abstractizarii; implica mecanizmul de mostenire
Reutilizarea codului Prin mecanismul de derivare metodele de
prelucrare mostenite sunt incluse automat, nu e necesara
rescrierea codului (definirea metodelor)

POO Tehnici de programare

Tehnici (moduri) de programare


Programare procedurala accentul se pune pe descompunerea
programului n proceduri (functii) care sunt apelate n
ordinea de desfasurare a algoritmului. Limbajele care
suporta aceasta tehnica de programare trebuie sa asigure
posibilitati de transfer a argumentelor catre functii si de
returnare a valorilor rezultate. Limbajul Fortran a fost
primul limbaj de programare procedurala . Au urmat
Algol60, Algol68, Pascal, C.
avantaje: dezvoltarea si depanarea usoara,
prin lucru cu blocuri de cod mai mici; posibiliatea de
reutilizare a unor functii deja definite pentru alte parti ale
aplicatiei

POO Tehnici de programare

Programare modulara complexitatea aplicatiilor a condus la


cresterea dimensiunii programelor, ceea ce a condus la
efortul de organizare mai buna a date si functiilor de
prelucrare; punand in evidenta corelatie (asociere) intre
procedurile de prelucrare si datele folosite de acestea,
apare posibilitatea izolarii lor in module separate (relativ
independent)
descompunerea unui program n module, care
ncorporeaza o parte din datele programului si functiile
care le manevreaza
avantaj principal: separarea/izolarea datelor
folosite in module diferite = tehnica (incipienta) de
ascunderea/protejarea datelor.
Observatii: - in interiorul unui modul se aplica principii de programare
procedurala;
- Gruparea de date si proceduri n module nu implica si o
asociere conceptuala

POO Tehnici de programare

Programare obiect orientata descompunerea aplicatiei la nivel


conceptual (abstractizari), fiecare continand datele si
procedurile proprii; necesara datorita cresterii complexitatii
aplicatiilor
utilizeaza mecanismele: abstractizare;
ncapsulare; ierarhizare etc.
Observatie: S-a pornit de la o descompunere algoritmica a aplicatiilor,
s-a ajuns la o descompunere conceptuala a lor
Exemplu: Dezvoltarea aplicatiilor vizuale: 3 clase principale (concepte)
MainFrame (interfata cu utilizatorul)=comenzi,
butoane,meniu
Document = stocare/salvare/citire date, prelucrare
View = vizualizare date

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