Programarea calculatoarelor II (C++)

Download Report

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 #using namespace std

D. Lucanu POO – Proiectarea de clase

cont.h (versiunea 02)

#include using namespace std; class Cont { public: . . .

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