Sunteți pe pagina 1din 29

Programare orientataobiect (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 Mller : 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 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.

D. Lucanu

POO Proiectarea de clase

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

Cont

sold depune( )

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

cont.depune(suma)

OK!

D. Lucanu

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

sectiuni publice

limitarea accesului la informatii

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; }
D. Lucanu

void Cont::depune(double suma) { sold += suma; } void Cont::setDob(double nouaRata) { actualizeazaSold(); rataDob = nouaRata; } . . .

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.

D. Lucanu

POO Proiectarea de clase

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 i j 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"); string s2; s2 = string("abc") s1 = s2 ; string s3(s2); s1 = "armata"; b = (s1 == s2); // creare sir dintr-un sir C // creare sir vid + s1; //creare sir si concat. // operator atribuire // apelare constructor de copiere // constructor si op. atribuire // operatorul de testare a egalit.

STL (Standard Template Library) #include <string> #using namespace std

D. Lucanu

POO Proiectarea de clase

cont.h (versiunea 02)


#include <string> 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