400 likes | 864 Views
Programare orientata- obiect (POO) utilizand C++. Dorel Lucanu. Bibliografie. H. Schildt : C++ manual complet, Teora, 2000 Bjarne Stroustrup: The C++ Programming Language, Adisson-Wesley, 3 nd edition, 1997 Manuale electronice
E N D
Programare orientata- obiect (POO)utilizand C++ Dorel Lucanu
Bibliografie • H. Schildt: C++ manual complet, Teora, 2000 • Bjarne Stroustrup: The C++ Programming Language, Adisson-Wesley, 3nd edition, 1997 Manuale electronice • Peter Müller : Introduction to Object-Oriented Programming Using C++ • Bruce Eckel : Thinking in C++, 2nd Edition • *** : Online C++ tutorial • SGI Standard Template Library Programmer's Guide POO – Proiectarea de clase
Organizare • pagina curs: • e posibil ca ordinea unor tematici sa fie schimbata • laboratoarele • exercitii de antrenament • exercitii de test • examinare • pe parcurs: 2 teste • 60% din nota finala • laborator • 40% din nota finala • conditii de promovabilitate • 40% din punctajul maxim de la teste • 60% din punctajul maxim de la laborator POO – Proiectarea de clase
Curs 1 • Primul pas in POO • incapsulare si ascundere • Clase si obiecte • atribute, metode, stari • declararea claselor si obiectelor in C++ • utilizarea obiectelor in C++ • constructori, destructori • exemplul Cont • Tipuri abstracte de data si obiecte • Exemplul Stiva • Utilizare de clase: my_string POO – Proiectarea de clase
Obiecte si clase • O prima definitie pentru obiecte si clase: • Un obiect este caracterizat de: • nume • atribute (date) • valorile atributelor la un moment dat definesc o stare • metode (servicii, operatii) • O clasa descrie unul sau mai multe obiecte ce pot fi precizate printr-un set uniform de atribute si metode. POO – Proiectarea de clase
nume atribute metode Obiecte si clase - reprezentare grafica POO – Proiectarea de clase
Clasa Cont (versiunea 01) • Specificarea clasei • Un cont bancar: • are un titular, sold, o rata a dobinzii, numar de cont si • se pot efectua operatii de depunere, extragere, actualizare sold • Extragerea atributelor: • titular, sold, rata a dobinzii, numar de cont • Extragerea metodelor • depunere, extragere, actualizare sold • Completarea specificatiei • actualizare sold data ultimei operatii POO – Proiectarea de clase
Clase (continuare) • definitia unei clase presupune: • combinarea datelor cu operatii • ascunderea informatiei POO – Proiectarea de clase
Cont sold sold depune( ) depune( ) Combinarea datelor cu operatiile asupra lor • datele si operatiile asupra lor sint incluse in aceeasi unitate sintactica • datele si procesele devin legate • C++: clase, structuri POO – Proiectarea de clase
OK! cont.depune(suma) Ascunderea informatiei • modul de structurare a datelor nu este cunoscut • actiunile asupra datelor sint realizate numai prin operatiile (metodele) clasei • si anumite actiuni pot fi ascunse: e.g., validare a contului cont.sold += suma POO – Proiectarea de clase
Incapsulare Incapsulare Ascundere = Combinare + POO – Proiectarea de clase
Combinarea: avantaje • defineste clar ce structuri de date sint manevrate si care sunt operatiile legale asupra lor • adauga programului modularitate • scade riscul ca datele sa fie alterate de programele "slabe" • faciliteaza ascunderea informatiei POO – Proiectarea de clase
Ascunderea informatiei: avantaje • programe mai sigure si fiabile • elibereaza clasele utilizator de grija cum sint manevrate datele • previne aparitia erorilor produse de clasele utilizator ce manevreaza datele utizind cod "slab" POO – Proiectarea de clase
Incapsulare (Combinare + Ascundere): avantaje • combinare + ascunderea informatiei = protejarea datelor • previne aparitia erorilor prin limitarea accesului la date • asigura portabilitatea programelor • faciliteaza utilizarea exceptiilor • interfata unei clase = operatiile cu care o clasa utilizator poate manevra datele POO – Proiectarea de clase
sectiuni publice sectiuni private Structurarea nivelului de acces la informatie limitarea accesului la informatii POO – Proiectarea de clase
Cont.h class Cont { public: Cont(); ~Cont(); void depune(double); void extrage(double); void setDob(double); private: char *titular; char *nrCont; double sold; double rataDob; char *dataUltOp; void actualizeazaSold(); void atribuieNrCont(); }; POO – Proiectarea de clase
Cont::Cont() { titular = NULL; dataUltOp = NULL; sold = 0; rataDob = 0; atrbuieNrCont(); } Cont::~Cont() { delete titular; delete dataUltOp; } void Cont::depune(double suma) { sold += suma; } void Cont::setDob(double nouaRata) { actualizeazaSold(); rataDob = nouaRata; } . . . Cont.cpp POO – Proiectarea de clase
Demo.cpp void main() { Cont cont; cont.depune(2000); } cont.sold += 5000; error C2248: 'sold' : cannot access private member POO – Proiectarea de clase
Tipuri de date abstracte si obiecte • A doua definitie pentru obiecte si clase: • O clasa este o implementare a unui tip de date abstract. Ea defineste atribute si metode care implementeaza structura de date respectiv operatiile tipului de date abstract. • Un obiect este o instanta a unei clase. El este unic determinat de numele sau si defineste o stare reprezentata de valorile atributelor sale la un anumit moment particular. POO – Proiectarea de clase
Stiva tab[0..MAX-1] virf push() pop() top() este_vida() Stiva • tipul de data abstract Stiva • entitati de tip data: liste LIFO • operatii • push() • pop() • top() • este_vida() POO – Proiectarea de clase
Stiva.h class Stiva { public: Stiva(); ~Stiva(); void push(char); void pop(); char top(); bool este_vida(); private: char tab[MAX_STIVA]; int virf; }; POO – Proiectarea de clase
Stiva.cpp void Stiva::push(char c) { if (virf == MAX_STIVA-1) throw "Depasire superioara."; tab[++virf] = c; } char Stiva::top() { if (virf < 0) throw "Depasire inferioara."; return tab[virf]; } POO – Proiectarea de clase
Stiva_demo Stiva s; char c = 'a'; try { while (true) { s.push(c++); cout << s.top() << endl; } } catch (char *mes_err) { cout << mes_err << endl; } a b c d e f g h i j Depasire superioara. Press any key to ... POO – Proiectarea de clase
Utilizarea de clase • exista multe bibloteci de clase • STL • MFC • etc • pentru utilizare, trebuie cunoscuta doar interfata (elementele publice) • nu intereseaza implementarea • programul care utlizeaza clasa este independent de implementarea clasei • Exemplu: string • my-string.h • STL POO – Proiectarea de clase
my_string.h class string { public: // Constructori/destructori string(); string(char* new_string); string(const string& new_string); . . . ~string(); POO – Proiectarea de clase
my_string.h (continuare) // operatii int size() const; const char* c_str() const; // operatori friend string operator+ (const string& lhs, const string& rhs); string& operator= (const string& a_string); . . . private: char* char_arr; int string_length; }; POO – Proiectarea de clase
my_string - utilizare string s1("123"); // creare sir dintr-un sir C string s2; // creare sir vid s2 = string("abc") + s1; //creare sir si concat. s1 = s2 ; // operator atribuire string s3(s2); // apelare constructor de copiere s1 = "armata"; // constructor si op. atribuire b = (s1 == s2); // operatorul de testare a egalit. STL (Standard Template Library) #include <string> #using namespace std POO – Proiectarea de clase
cont.h (versiunea 02) #include <string> using namespace std; class Cont { public: . . . private: string titular; string nrCont; . . . string dataUltOp; . . . }; POO – Proiectarea de clase
demo.cpp (versiunea 02) Cont cont("Ionescu", 10000); cont.extrage(2000); cont.afiseaza(); Titular: Ionescu Sold: 8000 ... #include "..\string\my_string.h" ... Titular: Ionescu Sold: 8000 POO – Proiectarea de clase