Transcript Programarea calculatoarelor II (C++)
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
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 D. Lucanu 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 D. Lucanu 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
D. Lucanu POO – Proiectarea de clase
Obiecte si clase
O prima definitie pentru obiecte si clase: • Un
obiect
• nume • atribute (date) • este caracterizat de: 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 D. Lucanu
Obiecte si clase - reprezentare grafica
nume atribute metode D. Lucanu 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 D. Lucanu POO – Proiectarea de clase
Clase (continuare)
definitia unei clase presupune: • combinarea datelor cu operatii • ascunderea informatiei D. Lucanu POO – Proiectarea de clase
Combinarea datelor cu operatiile asupra lor
datele si operatiile asupra lor sint incluse in aceeasi unitate sintactica • datele si procesele devin legate sold depune( ) Cont sold depune( ) C++: clase, structuri D. Lucanu POO – Proiectarea de clase
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
D. Lucanu
cont.depune(suma)
OK!
POO – Proiectarea de clase
Incapsulare
Incapsulare = Combinare + Ascundere
D. Lucanu 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 D. Lucanu 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" D. Lucanu 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 D. Lucanu POO – Proiectarea de clase
Structurarea nivelului de acces la informatie
limitarea accesului la informatii sectiuni publice sectiuni private D. Lucanu 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(); };
D. Lucanu POO – Proiectarea de clase
Cont.cpp
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; } . . .
D. Lucanu POO – Proiectarea de clase
Demo.cpp
void main() { Cont cont; cont.depune(2000); } cont.sold += 5000;
error C2248: 'sold' : cannot access private member D. Lucanu 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 D. Lucanu
Stiva
tipul de data abstract Stiva entitati de tip data: liste LIFO operatii push() pop() top() este_vida() Stiva tab[0..MAX-1] virf push() pop() top() este_vida() D. Lucanu 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;
D. Lucanu 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]; }
D. Lucanu 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 j i Depasire superioara.
Press any key to ...
D. Lucanu 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 D. Lucanu POO – Proiectarea de clase
my_string.h
class string { public: // Constructori/destructori string(); string(char* new_string); string(const string& new_string); . . .
~string();
D. Lucanu 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;
D. Lucanu 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
D. Lucanu POO – Proiectarea de clase
cont.h (versiunea 02)
#include
private: string titular; string nrCont; . . .
}; string dataUltOp; . . .
D. Lucanu 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 D. Lucanu POO – Proiectarea de clase