Sunteți pe pagina 1din 29

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

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 sold

depune( ) 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 private:
{ char *titular;
public: char *nrCont;
Cont(); double sold;
~Cont(); double rataDob;
void char *dataUltOp;
depune(double); void
void actualizeazaSold();
extrage(double); void
void atribuieNrCont();
setDob(double); };

D. Lucanu POO – Proiectarea de clase


Cont.cpp
Cont::Cont() void Cont::depune(double suma)
{ {
titular = NULL; sold += suma;
dataUltOp = NULL; }
sold = 0; void Cont::setDob(double
rataDob = 0; nouaRata)
atrbuieNrCont(); {
} actualizeazaSold();
Cont::~Cont() rataDob = nouaRata;
{ }
delete titular; . . .
delete dataUltOp;
}

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.

D. Lucanu POO – Proiectarea de clase


Stiva

 tipul de data abstract Stiva


Stiva
 entitati de tip data: liste LIFO
 operatii tab[0..MAX-1]
 push() virf
 pop()
push()
 top()
pop()
este_vida()
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) { a
s.push(c++); b
c
cout << s.top() << endl; d
e
} f
} g
h
catch (char *mes_err) { i
cout << mes_err << endl; 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"); // 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

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

S-ar putea să vă placă și