Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

31
Page | 1 Proiectare şi programare orientă pe obiecte Obiective 1. Prezentarea conceptelor fundamentale ale programării orientate pe obiecte: clase, obiecte, mesaje, încapsulare, ierarhie de clase, legare dinamică a metodelor, polimorfism 2. Crearea deprinderilor de modelare si proiectare orientata pe obiecte 3. Familiarizarea cu limbajele de specificare a sistemelor orientate pe obiecte (UML) 4. Însusirea tehnicilor de programare orientată pe obiecte în C++ si Java 5. Cunoasterea metodologiilor de analiză, de programare orientata pe obiecte si testare a sistemelor reale

Transcript of Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page 1: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 1

Proiectare şi programare orientă pe obiecte

Obiective

1. Prezentarea conceptelor fundamentale ale programării orientate pe

obiecte: clase, obiecte, mesaje, încapsulare, ierarhie de clase, legare

dinamică a metodelor, polimorfism

2. Crearea deprinderilor de modelare si proiectare orientata pe obiecte

3. Familiarizarea cu limbajele de specificare a sistemelor orientate pe

obiecte (UML)

4. Însusirea tehnicilor de programare orientată pe obiecte în C++ si Java

5. Cunoasterea metodologiilor de analiză, de programare orientata pe

obiecte si testare a sistemelor reale

Page 2: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 2

Tematica de curs 1. Principii ale proiectarii si programarii orientate pe obiecte

2. Concepte de bază ale limbajului C++ (sau cum se trece de la C la C++):

� Aspecte lexicale, Declaraţii şi Definiţii, Tipuri fundamentale/derivate,

� Referinţe, Pointeri, Argumente implicite ale funcţiilor,

� Supraincărcarea funcţiilor, Clase şi operatori, Precedenţa operatorilor,

� Expresii. Convenţii. Fişierele unui program C++.

3. Clase şi obiecte:

� Date şi funcţii membre, Clase, Structuri şi Uniuni,

� Constructori şi Destructori, Clase locale, Clase imbricate

� Funcţii şi Clase Friend. Alocarea dinamică a obiectelor.

4. Sistemul I/O din C++

5. Functii de conversie si constructorii de copiere. Supraincărcarea operatorilor

6. Clase derivate. Moşteniri

7. Polimorfism, functii virtuale

8. Programare generica. Clase şi funcţii template

9. Tratarea exceptiilor

10. Biblioteca STL, containere, iteratori

Laborator

1. Laboratorul este obligatoriu

2. Exercitii rezolvate cu grad de dificultate de la simplu la complex

3. Teme de rezolvat acasa

4. Prezentari de teme

Page 3: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 3

Bibliografie

1. Kris Jamsa, Lars Klander – Totul despre C si C++, Ed. Teora, 2000 2. Bruce Eckel – Thinking in C++, Prentice Hall Inc., 2000 3. Herbert Schildt – C++ Manual complet, Ed. Teora, 1998 4. Bjarne Stroustrup – The C++ Programming Language, Third Edition, Addison Wesley

Longman, Inc., 1997 5. Dorin Mircea Popovici, Ioan Mircea Popovici, Iusti Tanase – Tehnologia orientată pe

obiecte. Aplicatii, Ed. Teora, 1996

Page 4: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 4

Lectia1 - Introducere în programarea orientată obiect

Ce este PPOO? Orice program poate fi perceput ca o colecŃie de date şi de operaŃii care se execută asupra datelor. În programarea procedurală aceste două elemente sunt tratate separat, reprezentarea datelor se realizează cu ajutorul tipurilor de date iar reprezentarea operaŃiilor se face prin funcŃii şi proceduri. Folosirea funcŃiilor nu este suficientă dacă se doreşte o descriere şi implementare eficientă a unor algoritmi ce necesită structuri de date complexe în rezolvarea problemelor.

Page 5: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 5

În plus, dacă se doreşte reutilizarea unor programe scrise anterior în rezolvarea unor noi probleme va fi necesar un efort considerabil din partrea programatorului să adapteze codul sursă reutilizat la noile nevoi iar aceasta va duce la apariŃia a numeroase erori. Din acest motiv este mult îngreunat şi lucrul în echipă, dacă un programator trebuie să implementeze o funcŃie, acesta va trebui să studieze şi celelalte module ale programului.

Un limbaj de programare potrivit acestor sarcini ar trebui să permită atât încapsularea structurilor de date cât şi a funcŃiilor care operează cu aceste structuri ca o singură entitate, să permită ascunderea detaliilor de implementare a operaŃiilor şi să permită reutilizarea şi extinderea unor module existente (chiar şi a celor compilate – fără recompilare). In cazul PPOO un program reprezinta o colectie de obiecte care interactioneaza intre ele. Obiectele din program modeleaza obiecte din lumea reala. Un obiect in memorie poate fi reprezentat clase – adica un set de date si un numar de functii care opereaza asupra datelor, definite impreuna.

Page 6: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 6

S-a impus astfel, nevoia unui model de programare capabil să depaşească limitările programării structurate şi care să permită realizarea unei abstractizări adecvate a datelor şi a operaŃiilor în aşa fel încât să permită o tratare unitară a acestora. Aşa s-a născut clasa limbajelor de programare orientate pe obiecte din care face parte şi limbajul C++. Programarea orientată pe obiecte – POO - (object-oriented programming) este o metodă de programare în care programele sunt organizate sub formă de colecŃii de obiecte care conlucrează între ele, fiecare dintre acestea reprezentând o instanŃă a unei clase, iar clasele sunt membre ale unei ierarhii de clase, corelate între ele prin relaŃii de moştenire.

Page 7: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 7

Modelul de programare orientată pe obiecte rezolvă aceste probleme având la bază următoarele principii importante: abstractizare, încapsulare, modularizare, moştenire şi polimorfism.

Page 8: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 8

Principii fundamentale în programarea orientată pe obiecte

Abstactizarea Abstractizarea înseamnă identificarea similitudinilor între diferite entit ăŃi, situaŃii sau procese din lumea reală şi decizia de a se concentra atenŃia asupra acestor aspecte comune şi ignorarea pentru început a celorlate aspecte. Abstractizarea este un model în care un obiect este privit prin prisma metodelor (operaŃiilor) sale, ignorându-se pentru moment detaliile de implementare a acestora. O bună abstractizare va defini în mod clar graniŃele conceptuale ale obiectului, va scoate în evidenŃă doar aspectele semnificative ale obiectului, acelea care fac ca acesta să se diferenŃieze de alte obiecte şi va estompa celelalte caracteristici. Aşadar, în procesul de abstractizare atenŃia este îndreptată spre aspectul exterior al unui obiect, spre modul său de comportare şi nu spre felul în care această comportare este implementată. Comportarea unui obiect se caracterizează printr-un număr de servicii sau resurse pe care acesta le pune la dispoziŃia altor obiecte. MulŃimea operaŃiilor unui obiect împreună cu regulile lor de apelare constituie interfaŃa obiectului. Programatorii utilizează abstractizarea pentru a simplifica analiza, proiectarea şi implementarea programelor complexe. În programarea orientată pe obiecte instrumentul de bază pentru abstractizare este clasa.

Page 9: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 9

Încapsularea Încapsularea este procesul de compartimentare a elementelor unei abstractizări (a unui model) în două păr Ńi: structura intern ă şi comportarea. Încapsularea permite separarea comportării (accesată printr-o interfa Ńă) de structura interna definită prin implementare.

Încapsularea este conceptul complementar abstractizării. Dacă rezultatul operaŃiei de abstractizare pentru un anumit obiect este identificarea interfeŃei, atunci încapsularea trebuie să definească reprezentarea (structura) internă a obiectului şi să selecteze o implementare a interfeŃei acestuia. Prin urmare, încapsularea este procesul în care are loc separarea interfeŃei de implementare şi ascunderea implementării faŃă de exterior. Separarea interfeŃei de reprezentarea unui obiect şi de implementarea metodelor sale permite modificarea structurii obiectului şi a metodelor fără a afecta în nici un fel programul care foloseşte obiectul, întrucât acesta depinde doar de interfaŃă. Încapsularea permite modificarea programelor într-o manieră eficientă, cu un efort limitat si bine localizat.

Page 10: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 10

Tipizarea (typing) Tipul este o caracterizare precisă, structurală şi comportamentală a unei colecŃii de entităŃi. Deşi conceptul tipul este similar conceptului de clasă, tipizarea se referă la un element diferit al modelului obiect de cât cel la care se referă clasele. Tipizarea este o accentuare a clasei unui obiect, astfel încât obiecte de clase diferite nu pot fi intershimbate între ele sau, cel mult, pot fi interschimbate într-un mod foarte restrictiv.

Page 11: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 11

Modularizarea Modularizarea este procesul de partiŃionare a unui program în componente individuale (module) ceea ce permite reducerea complexităŃii programului prin definirea unor grani Ńe bine stabilite şi bine documentate în program.

Clasele obŃinute în urma abstractizării şi încapsulării trebuiesc grupate şi apoi stocate într-o formă fizică, denumită modul. Modulele pot fi privite ca fiind containerele fizice în care declarăm clasele şi obiectele rezultate în urma proiectării la nivel logic. Modulele formează aşadar arhitectura fizică a programului. Modularizarea constă în divizarea programului într-un număr de module care vor fi dezvoltate şi compilate separat, dar care sunt conectate între ele. Scopul descompunerii în module este reducerea costurilor prin posibilitatea de a proiecta, dezvolta, testa şi revizui părŃi ale programului într-un mod independent. Concret, în C++ modulele sunt fişiere ce se compilează separat. În practică se obişnuieşte ca interfaŃa unui modul să fie plasată într-un fişier header (cu extensia “.h”), în timp ce implementarea acestuia se va regăsi într-un fişier sursă (cu extensia “.cpp”). DependenŃele dintre module vor fi exprimate utlizând directivele de tip “#include”.

Page 12: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 12

Moştenirea Moştenirea este o modalitate de a ordona abstactizările (tipurile abstacte de date, clasele). Prin moştenire se crează o ierarhie de tipuri existând o relaŃie dintre aceste tipuri.

Nu de puŃine ori, scriind programe în maniera clasică, eram puşi în situaŃia de a adapta sau rescrie funcŃii scrise anterior. Această etapă de implementare consuma mai mult timp decât era necesar şi, în plus, exista riscul apariŃiei de numeroase erori. O variantă mult îmbunătăŃită de reutilizare a codului este moştenirea. Moştenirea este unul dintre cele mai importante concepte ale limbajelor de programare pe obiecte. Aceasta permite extinderea obiectelor existente şi construirea de noi obiecte într-un mod simplu. Astfel, o clasă poate moşteni toate caracteristicile uneia sau a mai multor clase create anterior la care poate adăuga trăsături noi şi, în anumite condiŃii, poate redefini unele din metodele moştenite.

Page 13: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 13

Polimorfismul Tehnica ce vine in ajutorul abstractizării care prmite utilizarea unor tipuri abstracte de date in proiectarea programelor astfel încât obiectele cu care lucreaza programul pot si substituite cu altele sau se pot adăuga obiecte noi cu aceeaşi “form ă“ f ără modificarea sau recompilatea programului. Polimorfismul este o facilitate a programării orientate obiect care oferă instanŃelor unor clase de a reacŃiona într-un mod specific la un mesaj (la un apel de funcŃie). Spre exemplu, într-o ierarhie de clase obŃinută prin moştenire, care reprezintă forme geometrice (puncte, linii, dreptunghiuri, cercuri) fiecare obiect are o funcŃie Draw(). Apelul acestei funcŃii printr-o referinŃă la un obiect grafic generic trebuie să se comporte corespunzător obiectului referit.

Page 14: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 14

Concurenţa ConcurenŃa permite ca mai multe obiecte diferite să fie în execuŃie în acelaşi timp.

Persistenţa Un obiect aflat în memorie ocupă un anumit spaŃiu în memorie şi are o existenŃă într-o perioadă determinată de timp din timpul de execuŃie al programului. Utilizând mecanisme specializate care asigură persistenŃa, obiectele pot fi salvate în fişiere sau in baze de date şi pot fi reincărcate mai târziu în altă sesiune a programului.

Page 15: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 15

Compilarea unui program in C++

Page 16: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 16

Identificatori şi cuvinte cheie în limbajul C++ Un identificator este o secvenŃă de lungime oarecare de litere şi cifre, cu condiŃia ca primul caracter să fie literă sau caracterul de subliniere _ (underscore). Literele mici sunt diferite de literele mari corespunzătoare. Următorii identificatori sunt rezervaŃi pentru a fi utilizaŃi de limbaj şi nu pot avea altă utilizare.

32 cuvinte cheie din limbajul C

auto const double float int short s truct unsigned break continue else for long signed s witch void case default enum goto register sizeof t ypedef volatile char do extern if return static u nion while

30 cuvinte rezervate adaugate de C++:

asm dynamic_cast namespace reinterpret_ca st try bool explicit new static_cast typeid catch false operator template typename class friend private this using const_cast inline public throw virtual delete mutable protected true wchar_t

11 cuvinte rezervate in C++ and bitand compl not_eq or_eq xor_eq and_eq bitor not or xor

Page 17: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 17

Clase şi obiecte Ce este o clasa ? In limbajele de programare orientate pe obiecte se introduce conceptul de clasa, prin acceasta datele sunt definite impreuna cu

functiile care le prelucrează. O clasă este un model simplificat al unui obiect din lumea reala.

O clasă reprezinta o definitie, un model pe baza caruia se vor crea obiecte. Prin definirea unei clase definim un nou tip de date, pe baza acestui tip de date se pot defini variabile din program, aceste variabile reprezintă obiectele din program. Un obiect este reprezentat printr-un set de date numite atribute şi un numar de functii numite metode. Conceptul fundamental din programarea orientată pe obiecte îl reprezintă notiunea de clasă ca tip de date definit de utilizator. Cuvântul cheie class ne permite să intrăm în universul programării orientate pe obiecte, cu ajutorul lui putem defini tipuri abstracte de date. Variabilele declarate pe baza unui tip abstract se numesc obiecte sau instanŃe ale clasei. Putem spune că:

Clasa = Date + Operaţii

Clasa = Atribute + Metode

Spre deosebire de structurile cunoscute din limbajul C, clasele conŃin nu numai date membre (numite şi atribute) ci şi funcŃii membre (care se mai numesc şi metode), constructori, un destructor şi o serie de operatori. Aceste funcŃii operează asupra datelor obiectului căruia îi aparŃin.

Page 18: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 18

Definirea claselor În general o clasă se defineşte astfel: class nume {

private: <atribute membre private> <constructori privati> <metode private>

protected: <atribute membre protejate> <constructori protejati> <metode protejate>

public: <atribute membre publice> <constructori publici> <destructor public> <metode publice>

};

Pentru exemplificare vom defini o serie de clase pentru reprezentarea figurilor geometrice în plan. Se ştie că figurile geometrice se contruiesc pornind de la unele forme simple cum sunt punctul, linia… Urmează un exemplu de declaraŃie de clasă care introduce un tip nou de date numit Punct.

Page 19: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 19

O clasa este formata din doua parti: declaratia sau interfata clasei si definitia sau implementarea acesteia. Interfata de obicei se introduce in fisiere header (*.h), iar definitia se va scrie in fisiere de implementare (*.cpp).

Exemplu

//Persoana.h

class Persoana

{

char nume[20];

int varsta;

public:

void citire();

void afisare();

};

//persoana.cpp

#include ”persoana.h”

#include<iostream>

Persoana::afisare()

{

std::cout<<nume<<“ “<<nume<<std::endl;

}

Page 20: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 20

Exemplu //fi şierul Point.h class Point {

protected: int x, y; //atribute

public: Point(); //constructor Point(int, int); //consructor ~Point(); //destructor void Print(); //func Ńie membra, metod ă void Read(); //func Ńie membra, metod ă

}; //fi şierul Point.cpp #include<iostream> using namespace std; Point::Point() { x = y = 0; } Point::Point(int x0, int y0) { x = x0; y = y0; } Point::~Point() {} void Point::Print() { cout<<x<<” ”<<y<<endl; } void Point::Read() { cout<<”x = ”; cin>>x; cout<<”y = ”; cin>>y; }

Page 21: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 21

Atribute si metode Datele definite intr-o clasa se numesc atributele clasei, functiile membre ale unei clase poarta numele de metode. In cazul nostru datele x si y sunt atribute, functiile Read si Print sunt metode.

Page 22: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 22

Constructorii În limbajul C++ constructorii sunt funcŃii membre speciale care asigură crearea şi distrugerea corectă a obiectelor. Constructorul unei clase este prima metodă care este apelată la declararea unui obiect, imediat după alocarea memoriei necesare datelor membre. Constructorul este apelat imediat ce o variabilă intră în domeniul ei de vizibilitate, adică atunci când execuŃia unui program "atinge" instrucŃiunea în care aceasta este declarată. Un constructor poate indeplini o mare varietate de sarcini, ca de exemplu iniŃializarea variabilelor interne, alocări dinamice de memorie, deschidere de fişiere, etc. Avem următoarele reguli privind constructorii:

• numele unui constructor trebuie să fie identic cu numele clasei; • constructorii nu returnează nimic, nici măcar tipul void; • constructorul poate apela alte funcŃii membre sau nu; • constructorul nu poate fi virtual; • constructorul, ca orice altă metodă poate fi supraîncărcat, pot să există deci mai mulŃi constructori într-o clasă, având acelaşi nume cu

numele clasei dar deosebindu-se prin lista de parametrii formali; • clasă poate avea oricâŃi constructori, inclusiv nici unul, dacă nu s-a declarat nici un constructor compilatorul generează un constructor

implicit, public, fără parametrii; • constructorul implicit, folosit fără parametrii la iniŃializarea obiectelor, dacă este definit, trebuie să fie definit fără parametrii sau să

folosească valori prestabilite ale parametrilor formali; • în mod normal constructorii sunt declaraŃi ca fiind publici, în cazuri speciale aceştia pot fi declaraŃi private şi nu vor putea fi apelaŃi

decât din cadrul altor funcŃii membre sau de tip friend, clasele din această categorie se numesc clase private; • dacă o clasă conŃine date membre constante sau referinŃe la obiecte, atunci constructorul trebuie scris în aşa fel încât să iniŃializeze

referinŃele înaintea celorlalte date membre; • constructorul de copiere iniŃializează un obiect printr-o operaŃie de copiere a datelor dintr-un obiect existent, având o referintă la

acesta; • dacă în cadrul unei clase nu este declarat un constructor de copiere, compilatorul crează unul implicit; • se recomandă definirea unui constructor de copiere în special în cazul în care se lucrează cu clase care manevrează structuri de date

dinamice, aceşti constructori realizează o copie profundă a obiectelor, care implică şi datele alocate dinamic, în timp ce constructorul de copiere introdus de compilator realizează o copie superficială a obiectelor, copiind doar datele membre ale claselor bit cu bit.

Page 23: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 23

Exemplu: //fi şierul Circle.h #include "Point.h" #define pi 3.14159265

class Circle { public:

Circle(){radius = 0;} Circle(int r){radius = r;} Circle(int x, int y, int r){ Set(x,y,r);} Circle(Circle&); float Area(){ return pi * radius * radius;}

protected: Point center;

int radius; public:

void Read(); void Print(); void Set(int, int, int);

};

//fi şierul Circle.cpp #include "Circle.h"

Circle::Circle(Circle &a) {

center = a.center; radius = a.radius; } void Circle::Set(int x, int y, int r) {

center.Set(x,y); radius = r;

} void Circle::Read() {

center.Read();

Page 24: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 24

cout<<"Raza = "; cin >> radius; } void Circle::Print() {

cout<<”Circle:”<<end; center.Print(); cout<<"Radius = "<<radius<<endl;

}

Page 25: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 25

Destructorul Destructorul este elementul care dezactivează toate funcŃiile unui obiect înainte de eliberarea memoriei ocupate de acesta. Destructorii ca şi constructorii pot efectua orice fel de operaŃii, dar de obicei sunt utilizaŃi în clase care manevrează structuri de date alocate dinamic sau care operează cu fişiere sau cu fluxuri de comunicaŃie. Destructorul este apelat ori de cite ori se "atinge" punctul final al domeniului de vizibilitate al unei variabile, ca de exemplu: întoarcerea dintr-o funcŃie, terminarea unei bucle (pentru variabilele automatice declarate în interiorul unei bucle, etc). Perioada dintre momentul creării unei variabile şi momentul distrugerii sale se numeste "durata de viaŃă". Limbajul C++ dispune de urmatoarele reguli de folosire a destructorilor:

• numele destructorului trebuie să fie identic cu cel al clasei care îl conŃine şi trebuie să fie precedat de caracterul tilda “~”; • destructorul nu returnează nici un tip de date, nici măcar void; • destructorul nu poate avea parametrii; • orice clasă nu poate avea mai mult de un destructor, dacă pentru o clasă nu este precizat nici un destructor atunci compilatorul crează

un destructor implicit pentru clasa respectivă; • dacă un obiect conŃine ca date membre alte obiecte atunci destructorii obiectelor membre sunt apelaŃi după ce destructorul clasei a

fost executat, ordinea în care sunt distruse componentele este inversă faŃă de cea în care au fost create (ordinea din declaraŃia clasei); • în timpul execuării programului este apelat automat destructorul obiectelor a căror durată de viaŃa a expirat. • Astfel, durata de viaŃă a obiectelor este: • obiectele automatice: sunt locale unei funcŃii şi de aceea sunt păstrate (create şi utlizate) pe stivă, acestea există atâta timp cât "există"

funcŃia, se crează în prologul funcŃiei şi se distrug în epilogul acesteia de către destructor; • obiectele statice: sunt declarate în afara funcŃiilor sau în interiorul funcŃiilor cu ajutorul cuvântului cheie static, acestea sunt create la

începutul programului şi există pe întreaga durată de execuŃie a programului, la terminarea programului se apelează destructorul fiecărui obiect static;

• obiecte dinamice: sunt utilizate prin alocare de memori din heap – o zona de memorie specială, sunt create cu operatorul new şi sunt eliberate explicit cu operatorul delete, pot exista şi după terminarea funcŃiei în care au fost create cu operatorul new, nu sunt eliberate automat;

• obiecte membre ale altor obiecte sunt create/distruse atunci când obiectul căruia îi aparŃin este creat/distrus.

Page 26: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 26

Declaraţii de obiecte. Instanţieri În limbajele de programare un loc central îl ocupă conceptul de tip de date. Fiecare variabilă care este prelucrată într-un program este de un "anumit tip" predefinit sau definit de programator. În limbajele de programare orientate obiect tipurile de date definite de programator, sau clasele - tipurile abstracte, sunt mai importante. Declararea unei variabile de un anumit tip abstract se numeşte instanŃiere iar variabilele se numesc obiecte sau instanŃe ale clasei. Sintaxa este asemănatoare cu cea a declaraŃiilor de variabile. //Fisierul program.cpp #include "Point.h" #include "Circle.h"

int main(void) {

Point A, B(1,2); Point C = Point(3,3); A.Set(10,5); A.Print(); A = C; A.Print(); Circle C1,C2(10); Circle C3 = Circle(10,10,10); Circle C4(C3), C5 = C4; C1.Read(); C1.Print(); C5.Print(); return 0;

}

Page 27: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 27

Modificatori de access Încapsularea nu presupune numai simpla combinare a metodelor şi a datelor ca o singură entitate ci şi o posibilitate de a limita accesul la datelor şi metodelor membre ale unei clase mai ales în situaŃii în care se doreşte prevenirea modificării accidentale a datelor aparŃinând unui obiect. În cadrul declarării unei clase, prin folosirea unor modificatori de acces, se poate preciza unul din cele trei niveluri de acces la datele şi metodele clasei, astfel: � private – este modul implicit, membrii de acest tip sunt accesibili numai

metodelor membre şi a funcŃiilor de tip friend, aceste elemente sunt considerate proprii, intime clasei în care au fost declarate şi nu vor fi accesibile în clasele derivate;

� protected – este similar modului private, în plus membrii sunt accesibili şi în metodele claselor derivate (în cazul moştenirii publice), acest modificator este recomandat să se folosească în clasele ce urmează să fie extinse;

� public – toate atributele şi metodele publice pot fi accesate sau apelate din orice punct din program exterior clasei, unde este cunoscută clasa.

Trebuie să reŃinem că limbajul C++ nu impune o anumită ordine de folosire a acestor modificatori iar atributele şi metodele fără modificator de acces sunt considerate private. SecŃiunile unei clase pot apărea de mai multe ori în cadrul declaraŃiei unei clase. În cele mai multe situaŃii datele membre se vor plasa în secŃiunile protejate pentru a permite accesul acestora din cadrul claselor derivate.

Page 28: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 28

De asemenea se recomandă evitarea plasării datelor în secŃiunea publică. Se recomandă folosirea funcŃiilor membre pentru iniŃializarea şi prelucrarea datelor membre. Clasele pot avea mai mulŃi constructori (de obicei publici) şi cel mult un destructor public. În cazul nostru metodele care urmează imediat după cuvântul public sunt publice, cu alte cuvinte acestea pot fi accesate din exterior oriunde în program unde clasa Point este accesibilă. Domeniul de vizibilitate al atributelor şi metodelor este este acelaşi cu domeniul de vizibilitate al clasei. Deoarece declaraŃia lui C1 nu specifică nici un argument compilatorul apelează constructorul fără parametrii, C2 se va iniŃializa cu ajutorul constructorului cu doi parametrii, instanŃa C4 va fi o copie lui C3 (primit ca argument), deci pentru C4 se va utiliza constructorul de copiere. O altă metodă de iniŃializare foloseşte listele de instanŃiere. O astfel de listă conŃine a membrilor clasei ce urmează a fi iniŃilizaŃi şi se plasează între lista de parametrii a costructorului şi corpul acestuia. Listă este formată din constructori cu parametrii specifici, câte unul pentru fiecare membru ce trebuie iniŃializat în acest mod. Această metodă este singura care se poate folosi la iniŃializarea clasei ce conŃine date membre constante, referinŃe la obiecte sau obiecte fără constructor implicit public. Un aspect important legat de listele de instanŃiere este ordinea în care se face iniŃializarea în cadrul acesteia, mai ales dacă la iniŃializarea unor membrii se folosesc valorile altora. Ordinea de instanŃiere a datelor membre este dată întotdeauna de ordinea în care datele apar în declaraŃia clasei şi nu de ordine acestora din lista de instanŃiere. Dacă un obiect membru conŃine în declaraŃia clasei sale un constructor implicit atunci acest obiect poate lipsi din lista de instanŃiere. În cazul în care un membru al unei clase este un pointer la un obiect atunci nu putem iniŃializa pointerul în cadrul listei de instanŃiere, constructorii nu pot fi apelaŃi pentru pointeri la obiecte (în această listă) ci numai pentru obiecte şi referinŃe.

Page 29: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 29

Exemplu //fi şierul Rectangle.h #include "Point.h" class Rectangle { protected: Point A, B; public: Rectangle(){ }

Rectangle(int x1,int y1,int x2,int y2):A(x1,y1),B(x2,y2){ } Rectangle(Point &a, Point &b ):A(a), B(b){ } Rectangle(Rectangle & r):A(r.A), B(r.B){ } int Area(){return (B.x-A.x)*(B.y-A.y);};

};

Page 30: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 30

Declararea tablourilor de obiecte Aşa cum construim tablouri sau matrici de structuri în limbajul C, tot aşa putem construi tablouri sau masive de obiecte. Iată, de exemplu, cum putem defini un triunghi:

Point triunghi[3];

Pentru fiecare element al tabloului se va apela constructorul implicit. Triunghiul poate fi iniŃializat aşa cum se iniŃializează tablourile de structuri dacă obiectele componente conŃin doar membrii publici, nu conŃin metode virtuale şi nu provin din clase derivate.

Point triunghi[3] = {{0,0},{0,3},{4,0}};

În alt mod de iniŃializare a tabloului poate folosi lista de constructori într-un mod asemănător cu utilizarea listei de instanŃiere, iniŃializarea tabloului poate fi parŃială deoarece pentru restul elementelor se apelează constructorul implicit:

Point triunghi[10] = {Point(), Point(0,3), Point(4, 0)};

Page 31: Curs Introduce Re in Proiectarea Si Program Area Orientata Pe Obiecte

Page | 31

Bibliografie

1. Kris Jamsa, Lars Klander – Totul despre C si C++, Ed. Teora, 2000 2. Bruce Eckel – Thinking in C++, Prentice Hall Inc., 2000 3. Herbert Schildt – C++ Manual complet, Ed. Teora, 1998 4. Bjarne Stroustrup – The C++ Programming Language, Third Edition, Addison

Wesley Longman, Inc., 1997 5. Dorin Mircea Popovici, Ioan Mircea Popovici, Iusti Tanase – Tehnologia

orientată pe obiecte. Aplicatii, Ed. Teora, 1996