+ All Categories
Home > Documents > Programare Orientatc483 Pe Obiecte

Programare Orientatc483 Pe Obiecte

Date post: 22-Nov-2015
Category:
Upload: paval-virgil-alexandru
View: 27 times
Download: 4 times
Share this document with a friend
Description:
Programare Orientatc483 Pe Obiecte
24
Programare Orientată pe Obiecte Prof. Sanda Popescu
Transcript
  • 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.


Recommended