Date post: | 22-Nov-2015 |
Category: |
Documents |
Upload: | paval-virgil-alexandru |
View: | 27 times |
Download: | 4 times |
Programare Orientat pe Obiecte
Prof. Sanda Popescu
Scurt istorie a limbajului C++
C++ a fost inventat de Bjarne Stroustrup n 1979 la Bell Laboratories n Murray Hill, New Jersey. Iniial a fost numit C cu Clase, dar apoi n 1983 numele i-a fost schimbat n C++.
C++ conine ntreg limbajul C. Majoritatea completrilor fcute de Stroustrup limbajului C au fost concepute pentru a suporta programarea obiect-orientat. C++ este versiunea obiect-orientat a limbajului C.
Invenia C++ a fost necesar deoarece programele deveniser mari i complexe, i chiar un limbaj excelent ca C, nu putea face fa. n C, dac un program depete 25000 100000 de linii, devine mult prea complex ca s-l nelegi n totalitate.
C++ i propune s sparg aceast barier, s permit programatorului s neleag i s administreze programe mari i complexe.
Programarea Obiect-Orientat
Programarea Obiect-Orientat (POO sau OOP, de la Object-Oriented Programming) este o puternic metodologie de programare.
Anii 1960 au dat natere programrii structurate, metod ce st la baza limbajelor C sau Pascal. Programarea structurat i permitea s creezi, destul de uor, programe de complexitate moderat. Chiar dac este un concept puternic, limbajele structurate i ating limita atunci cnd un proiect devine mult prea mare.
Programarea obiect-orientat a preluat cele mai bune idei ale programrii structurate i le-a combinat cu noi concepte. Rezultatul a fost un nou stil de programare.
Principiul de baz al POO este c datele controleaz accesul la cod. ntr-un limbaj POO, programatorul definete datele i operaiile ce pot fi aplicate datelor. Toate limbajele OOP au trei trsturi n comun: ncapsularea, polimorfismul i motenirea.
Avantajele OOP
Preluarea soft-ului existent i dezvoltarea altuia nou, prin adugarea de date i metode noi, fr a fi necesar cunoaterea amnuntelor de realizarea soft-ului preluat
Abordarea unitar a diverselor structuri, indiferent de forma lor concret. n acest fel se pot trata unitar ferestrele, meniurile, datele de intrare, etc
Atenie!
Nu se va utiliza metoda POO n cazul aplicaiilor simple, dect dac dorim s explicm, din punct de vedere didactic, mecanismul de funcionare
Soft-ul realizat prin POO necesit resurse de sistem performante (memorie, capacitate hard-disk, etc), datorit numrului mare de date i metode care sunt definite n cadrul unui proiect dezvoltat prin POO.
Uneori mecanismul de selecie a metodelor poate fi greoi de utilizat
Concepte fundamentale
POO mbin trei concepte fundamentale:
1. ncapsularea
2. Motenirea
3. Polimorfismul
ncapsularea
ncapsularea este mecanismul ce leag la un loc codul i datele pe care le manipuleaz, i le protejeaz de interferenele i abuzurile din afar (adic acel cod de program care nu este legat de datele respective).
Cu alte cuvinte, ncapsularea este proprietatea ce permite ca o unic structur (obiectul) s conin att date ct i metode (funcii). n C++ ncapsularea este obinut prin structura numit clas.
ntr-un obiect att datele (variabilele) ct i codul (un set de instruciuni) pot fi private sau publice. Codul i datele private sunt accesibile numai n obiectul curent, adic doar anumite pri ale obiectului pot accesa acel cod i acele date. Asta nseamn c pri ale programului ce nu fac parte din obiect, nu pot accesa codul i datele private ale obiectului. n schimb, codul i datele publice sunt disponibile oricrei pri din program, pot fi accesate de oriunde.
n OOP, un obiect este practic o variabil; de fapt, de fiecare dat cnd definim un nou tip de obiect, definim un nou tip de dat, i fiecare instan a acestui tip este o variabil compus.
Motenirea
Motenirea este procesul prin care un obiect dobndete proprietile unui alt obiect. Acest lucru aduce n discuie conceptul de clasificare sau ierarhizare. De exemplu: mrul face parte din clasa fructe, care, la rndul ei, face parte dintr-o clas mai mare numit mncare. Fr conceptul de clasificare, un obiect trebuie s-i defineasc explicit toate caracteristicile. Atunci cnd se folosete motenirea, obiectul trebuie doar s defineasc acele caliti care-l fac unic, adic doar acele caracteristici particulare obiectului respectiv. Motenirea este un aspect important al POO.
n C++ motenirea este proprietatea ce permite ca dintr-o structur ce ncorporeaz date i metode, s obinem noi structuri ce conin noi date i metode. Motenirea se realizeaz prin derivarea claselor.
Polimorfismul
Polimorfismul poate fi caracterizat de fraza
"o singur interfa, multiple metode".
Polimorfismul este un atribut ce permite
utilizarea simultan a mai multor funcii (metode) care au un singur nume. n C++ polimorfismul este realizat prin
suprancrcarea funciilor, dar mai ales prin utilizarea funciilor virtuale.
Noiunea de Clas
O clas definete un nou tip de dat ce specific forma unui obiect. O clas include att date ct i codul ce va opera asupra acelor date. Aadar, o clas leag codul de date. Acest tip nou creat este folosit pentru a declara obiecte de tipul clasei. Obiectele sunt instane ale clasei. O clas este o abstractizare logic, iar un obiect are o existen fizic. Clasa este tipul de dat, iar obiectul este variabila.
Funciile i variabilele ce constituie clasa se numesc membri ai clasei respective. Aadar, o variabil declarat ntr-o clas se numete variabil membr, i o funcie declarat ntr-o clas se numete funcie membr.
Clasele sunt create cu cuvntul-cheie class. Declararea unei clase este asemntoare cu declararea unei structuri.
Forma general de declarare:
class nume-clasa { functii si date private specificator-de-acces: functii si date specificator-de-acces: functii si date // ... specificator-de-acces: functii si date } lista-obiecte;
Exemplu
Un principiu de baz al POO cere ca accesul la datele unui obiect s fie fcut exclusiv prin metodele sale .
Vom defini o clas rational i declarm un obiect a, al acestei clase, pe care l nzestrm cu trei metode:
void nr(int x=0, int y=1) care permite introducerea valorilor p i q ale obiectului (parametri implicii 0 i 1);
int numarator() - returneaz p; int numitor() - returneaz q;
Programul C++
#include #include using namespace std; ifstream f("date.in"); ofstream g("date.out"); class rational { int p,q; public: void nr(int x=0, int y=1) { p=x; q=y; } int numarator() { return p; } int numitor() { return q; } float calcul(int p, int q) { return (float)p/q; } };
rational a; int x,y; int main() { f>>x>>y; a.nr(x,y); g
Operatorul de rezoluie ::
Acest operator este indispensabil n studiul claselor
Rolul su este de a permite accesul la variabilele globale ale programului
Dac sunt declarate dou variabile, una global i una local, avnd acelai nume, i dorim ca n cadrul unui bloc s avem acces la variabila global, utilizm operatorul de rezoluie care va precede variabila global.
Evident, am fi putut avea acces la variabila global fr a utiliza operatorul ::, dac nu am fi declarat o variabil local cu acelai nume.
Exemplu
#include int i=1; int main() { int i=2; cout
Din exteriorul clasei, datele i metodele ei nu sunt accesibile direct. Pentru rezolvare, se folosete operatorul de rezoluie ::
#include #include using namespace std; ifstream f("date.in"); ofstream g("date.out"); class rational { int p, q; public: void nr(int, int); // prototip de funcie int numarator(); // prototip de funcie int numitor(); // prototip de funcie float calcul(int, int); // prototip de funcie }; rational a; int x,y; int i=1;
int main() { f>>x>>y; int i=2; a.nr(x,y); g
Constructori
O metod de a declara obiecte ale unei clase este prin intermediul unei metode speciale, ataat clasei, numite constructor. Un astfel de constructor este numit constructor generat implicit.
Exemplu: # include class intreg { public: int a; }; intreg g; int main() { intreg x, y, z; } Cu ajutorul constructorului generat implicit, s-au definit obiectele g,
x, y, z. O tentativ de a iniializa la declarare un obiect (de exemplu intreg
t=34) este sancionat cu mesajul error: conversion from `int' to non-scalar type ` intreg
Putem rezolva problema, nzestrnd clasa cu o funcie proprie constructor, care s respecte urmtoarele reguli:
- O metod constructor are ntotdeauna numele clasei din care face parte. Ea este apelat automat la declararea obiectelor
- Un constructor este o funcie fr tip, dar n dreptul tipului nu se trece cuvntul cheie void
Exemplu # include class intreg { public: int a; intreg() // nu are parametri formali { cout
n continuare, atam clasei un constructor cu un parametru implicit, constructorul ataat are rolul de a permite iniializarea, la declarare, a datelor
# include class intreg { public: int a; intreg (int v=12) // constructor cu parametru iniializat { cout
Observaii
O clas poate avea mai muli constructori, dar avei grij ca acetia s difere prin parametri (numr, tip), deoarece constructorii trebuie s poarte numele clasei
De regul, constructorii sunt definii n cadrul clasei, deoarece au puine instruciuni, i nu conin instruciuni repetitive
Un constructor nu poate avea un parametru formal de tipul clasei din care face parte
Exist o asemnare ntre declaraia variabilelor i declaraia obiectelor. De exemplu:
int a, b, c; intreg x, y, z; Sunt corecte i declaraiile: int a(2), b(3), c(4); //NCERCAI! intreg d=3, e=d; Concluzie: Clasele au caracteristicile tipurilor, obiectele au caracteristicile variabilelor
Destructori
Operaia de eliberare a memoriei alocate obiectelor este executat de o metod special, ataat clasei, numit destructor.
n cazul n care nu a fost definit un destructor, se genereaz implicit unul
Numele destructorului coincide cu numele clasei, creia i aparine, dar este precedat de caracterul ~
Destructorul nu are parametri formali O clas are un singur destructor Destructorul se apeleaz implicit cnd viaa unui obiect
nceteaz, la sfritul blocului n care a fost declarat Destructorul poate fi apelat explicit
De obicei, obiectele se distrug n ordine invers crerii lor, programul urmtor afieaz: creat 0 creat 2 creat 3 distrus 3 distrus 2 distrus 0
# include class intreg { public: int a; intreg(int v=0) // construcor { cout
Rezolvai
S se creeze clasa NumarNatural, ce cuprinde: a. O dat membru x, ntreg b. Urmtoarele metode:
i. Numrul de cifre zecimale ale lui x ii. Reprezentarea n baza 2 a lui x iii. Inversul (oglinditul) su iv. Proprietatea de primalitate a lui x
c. constructori ce permit declaraii ca: NumarNatural n, n(213) d. destructor
Scriei un program care citete un numr natural i care afieaz numrul de cifre ale numrului reprezentat n baza 2, verific dac este palindrom i afieaz mesajul E PRIM dac numrul nu are divizori n afar de 1 i el nsui, sau mesajul NU E PRIM, n caz contrar.
Rezolvai
2. S se creeze clasa NumarComplex, care permite lucrul cu numere complexe de forma z=a+bi, ce cuprinde:
a. Dou date membru a, b de tip float
b. Constructori ce permit declaraii ca: NumarComplex z, z(2) (ce reine numrul z=2+0i), z(1.2, -7.5)
c. Destructor
d. Metode de adunare, scdere, nmulire, mprire a dou numere complexe
Scriei un program care citete dou numere complexe i tiprete suma, diferena, produsul, ctul lor.
Rezolvai
3. S se creeze clasa NumarRational, care permite lucrul cu numere raionale de forma x=p/q, ce cuprinde:
a. Dou date membru p i q de tip ntreg b. Constructori ce permit declaraii ca: NumarRational a, a(2,5) c. Destructor
d. Metode de adunare, nmulire, mparire a dou numere raionale e. Metod de simplificare a unui numr raional cu cel mai mare divizor
comun dintre p i q f. Metod de amplificare a unui numr raional cu un numr natural
transmis prin parametru
Scriei un program care citete dou numere raionale i tiprete suma, produsul, ctul acestora, precum i verificarea unui numr raional dac este ireductibil, n caz contrar s se simplifice numrul ca s devin ireductibil. S se implementeze algoritmul care aduce dou fracii la acelai numitor comun.