Sunteți pe pagina 1din 32

C2: Introducere in programarea obiectuala

Cuprins:
Introducere Concepte de baza Structura unei clase Constructorii si destructorul unei clase Ambiguitati la apelul constructorilor cu parametri cu valori implicite Observatii importante Functii membru si obiecte de tip const Operatorii new si delete

C2: Introducere in programarea obiectuala


1. Introducere: Tipuri de programe:
Programare nestructurata: Programul principal opereaza direct cu datele (globale)

Programare procedurala: Programul principal apeleaza la proceduri. Dupa apelul acestora, controlul revine programului principal.

Programare procedurala:
Programul principal coordoneaza ce procedura este apelata si ce date sun trimise ca parametri.

C2: Introducere in programarea obiectuala

Programare modulara: Programul principal coordoneaza alegerea si lansarea in executie modulelor adecvate catre care sunt trimise ca parametri datele corespunzatoare. Fiecare modul poate avea datele proprii.

C2: Introducere in programarea obiectuala

Programare obiectuala: Obiectele (entitatile) unui program interactioneza unele cu celelalte, schimband mesaje intre ele.

C2: Introducere in programarea obiectuala


Abordarea problemelor:
Problema: orice situatie mai ciudata care necesita o rezolvare pentru care trebue consumati niste neuroni

Modelul:

Un punct de vedere abstract al problemei. Trebuie definite proprietatile cele mai importante ale acesteia.

Proprietati:
date caracteristici ce sunt definitorii; functii actiuni care modifica datele.
5

C2: Introducere in programarea obiectuala


Pana acum: functiile sunt mai importante decat datele; Aplicatiile au o viata mai scurta; Eforturile de intretinere si dezvoltare sunt mari.

In cadrul programarii obiectuale (C++): -Se imbina structurile de date cu algoritmii care le prelucreaza incluzandu-le in tipuri de date complexe ce pot fi definite de programe denumite clase ; => => => Modularizare sporita; Impartirea sarcinilor in echipa; Suport pentru extinderea usoara a aplicatiei; In loc de biblioteca de functii biblioteca de clase

C2: Introducere in programarea obiectuala


Notiunea de clasa si obiect:
Gandirea umana include conceptul de obiect (tv., fereastra, calculator, automobile etc.); Obiectele entitati distincte si dicrete; Prin clasificare obiectele care au aceeasi structura de date (atribute) si acelasi comportament (operatii) sunt grupate intr-o clasa;
Automobil

Exemple:
Autobuz

Tractor

Proprietati au motor propriu, viteza de deplasare; Functii transport.


7

C2: Introducere in programarea obiectuala


2. Concepte de baza:
Incapsulare (a) Mostenire (b) Polimorfism (c)

a) Incapsulare - uniunea in cadrul clasei a structurii de date cu codul operatiilor necesare prelucrarii lor

C2: Introducere in programarea obiectuala


b) Mostenire - se permite contruirea unor clase derivate:
Nasc pui vii, alapteaza

Latra, carnivori

Mamifere Caini Camile

Ciobanesc

cocker

paza

companie

C2: Introducere in programarea obiectuala


c) Polimorfism - facilitate ca intr-o ierarhie de clase obtinute prin mostenire, o functie cu acelasi nume sa aiba forme (implementari) diferite:

Figuri geometrice plane: -arie; -perimetru: = Calcul_Arie(); = Calcul_Perimetru()

Dreptunghi: -latime; -Lungime; = Calcul_Arie(); = Calcul_Perimetru();

Triunghi: -lat1; -lat2; -Lat3; = Calcul_Arie(); = Calcul_Perimetru();


10

C2: Introducere in programarea obiectuala


3. Structura (compozitia) unei clase: Exemplu:
class coordonate_3D { private: int x,y,z; // private cuvant rezervat // variabile, membrii clasei // public cuvant rezervat // funtii membre, membrii clasei // class cuvant rezervat // coordinate_3D numele clasei

public:
void line_to (int vx, int vy, int vz); } // explicitarea functiei/functiilor coordonate_3D :: line_to (int vx, int vy, int vz) { x = vx; y = vy; z = vz; // plot(); etc. } // utilizare: coordonate_3D p1, p2, p3; coordinate_3D pt[20];

// :: - operator de rezolutie

// definire obiecte 11

C2: Introducere in programarea obiectuala


class cuvant rezervat operatori de vizibilitate: (tot cuvinte rezervate) private elemente ce nu sunt vizibile din exteriorul clasei public sunt vizibile din exteriorul clasei

//apelare: p1.line_to(3,4,5);

//sau
p1->line_to(3,4,5);

12

C2: Introducere in programarea obiectuala


4. Constructorul (constructorii) si destructorul unei clase:
sunt functii speciale, membre ale clasei; constructorul are rolul de a crea obiecte are acelasi nume cu clasa; pot exista mai multi constructori difera lista parametrilor; nu se apeleaza explicit; nu returneaza nimic, nici macar void.

Exemplu (clasa vector de intregi):


class vector { // private: int size; int *p; public: vector (int); vector (in t, int[ ]); ~vector(); int getsize(void) {return size}; int get_elm(int); } // dimensiune // pointer catre sir

13

C2: Introducere in programarea obiectuala


// definire functii membru: vector::vector(int n) { size = n; p = new(int[n]); assert (p != NULL); } vector::vector(int n, int a[ ]) { size = n; assert (p = new(int[n])); for(int i = 0; i < n; i ++) p[i] = a[i]; } int vector::get_elm(int i) { return p[i]; } //apel: vector v(100); cout << v.getsize(); // constructor

// assert determina o eroare (*)

// atentie la erori

// primul constructor

(*) assert (cond)

=> daca nu este indeplinita se genereaza mesajul assertion failed: cond , File, line
14

C2: Introducere in programarea obiectuala


//utilizare: vector a(10); // primul constructor int x[100]; vector b(100, x); // al doilea constructor vector *pv; // pointer catre un obiec de tip vector pv = new vector(30); // creare obiect cout << a.getsize(); // sau cout << pv->getsize(); delete pv;

Destructorul:
class vector{ public:

~ nume_clasa (); fara tip sau parametri

~ vector (); } vector::~vector() { delete [ ]p; // !!! assert((p = new int [size]) != NULL) }

15

C2: Introducere in programarea obiectuala


Constructorul de copiere:
class vector { public: vector (vector &); } vector::vector(vector &v) { size = v.size; p = new int [size]; for (int i = 0; i < size; i ++) p[i] = v.p[i]; } //apel: vector b(a);
16

// sau size = v.getsize();

C2: Introducere in programarea obiectuala


Exemple:
class ora_exacta { int ora, minut, secunda; public: ora_exacta (int, int, int ); ora_exacta (int, int ); ora_exacta (int, ); ora_exacta ( ) {secunda = minut = ora = 0;}; ora_exacta (ora_exacta &); ~ora_exacta (); } ora_exacta:: ora_exacta (int o, int m, int s){ ora = o; minut = m; secunda = s; } ora_exacta:: ora_exacta (int o, int m){ ora = o; minut = m; secunda = 0; }

17

C2: Introducere in programarea obiectuala

ora_exacta:: ora_exacta (int o){ ora = o; minut = 0; secunda = 0; } ora_exacta:: ora_exacta (ora_exacta &o){ ora = o.ora; minut = o.minut; secunda = o.secunda; } //apel: ora_exacta o1, o2(10), o3(12, 15), o4(3, 4, 5);

18

C2: Introducere in programarea obiectuala


5. Ambiguitati la apelul constructorilor cu parametri cu valori implicite :
class nr{

int numar; public:


nr(); nr(int = 0); nr(int, int = 0); } nr::nr() { } nr::nr(int nn = 0) { } nr::nr(int nn1, nn2 = 0) { } // c1 // c2 // c3

void main() { nr n1; // ambiguu c1 sau c2 nr n2(1); // ambiguu c2 sau c3 nr n3(1, 2); // corect c3 }

//c1

//c2

//c3
19

C2: Introducere in programarea obiectuala


Exemplu:
# define MAX 30 class adresa{ char nume[MAX]; char prenume[MAX]; char strada[MAX]; int nr; public: adresa(char *, char *, char *, int); adresa(adresa &); } adresa::adresa(char *num, char *pren, char *str, int n = 0) { strcpy (nume, num); strcpy (prenume, pren); strcpy (strada, str); nr = n; }

// constructor c1 // constructor c2

20

C2: Introducere in programarea obiectuala


adresa::adresa(adresa &ar) { strcpy (nume, ar.nume); strcpy (prenume, ar.prenume); strcpy (strada, ar.strada); nr = ar.n; }
void main() { adresa adr1 (NNN, PPP, AAA, 22); adresa adr2 (adr1); adr2 = adr1; }

// C1 // C2 // atentie copiere bit cu bit

21

C2: Introducere in programarea obiectuala


6. Observatii importante si rafinari ale ideilor prezentate anterior:
a) Trebuie remarcate asemanarile si diferentele dintre structuri si clase: - asemanare findamentala: ambele pot contine atat date cat si functii -diferenta fundamentala: pentru clase membrii acestora sunt implicit -private (private), spre deosebire de structuri unde acestia sunt implicit publici (public); Cuvintele de baza private si public modifica vizibilitatea membrilor.

b) O clasa in C++ poate contine doua categorii speciale de functii (membru) constructori si destructor (doar unul).

22

C2: Introducere in programarea obiectuala


c) Functia membru al clasei constructor- are prin definitie acelasi nume cu cel al clasei si nu returneaza nimic. Aceasta este apelata la construirea unui nou obiect de tipul respective.

d) Obictele pot fi definite: local la nivelul unor functii; global avand un statut de variabile globale. Cand un obiect este este global variabila globala, constructorul este apelat atunci cand programul este executat. A se nota ca apelarea constructorului este facuta inainte de a lansa functia main() . Cand un obiect este declarat ca variabila statica, apelarea constructorului se face la lansarea functiei in care este declarat obiectul respective. Cand un obiect este o variabila locala (ne-statica) a unei functii, constructorul este apelat de fiecare data cand functia este apelata, in momentul (locul) in care variabila este definite.
23

C2: Introducere in programarea obiectuala


Exemplu (ilustrativ):
#include <iostream.h> // clasa Test cu o functie constructor class Test{ public: Test(); };

// zona de declaratii poblice // constructor

Test::Test() {
cout<< apelare constructor al clasei Test\n; } // programul: Test g; void func() { Test l; cout << mesaj din functia func() << endl; }

// definitia constructorului

// obiect global

// obiec local

24

C2: Introducere in programarea obiectuala


int main() { Test x; cout << mesaj din funtia main() << endl; func(); return (0); } // constructorul nu face nici o operatie speciala doar tipareste un mesaj // constructorul nu are nici un parametru mai este denumit si constructor //default // mesajele rularii programului demonstrative aparute in ordine apelare constructor al clasei Test apelare constructor al clasei Test mesaj din functia main() apelare constructor al clasei Test mesaj din functia func() - pt. obiectul global g - pt. obiectul x din main() - pt. obiectul l din func() // obiect local in main()

25

C2: Introducere in programarea obiectuala


e) Destructorul este cea de-a doua functie speciala a unei clase. Efectul acesteia este opus celor al constructorilor, este apelat atunci cand obiectul inceteaza sa mai existe. Pentru obiectele care sunt declarate ca variabile locale ne-statice destructorul este apelat (chemat) atunci cand blocul in care este definit obiectul este parasit.

Pentru obiectele definite oriunde in interiorul unor functii destructorul este chemat doar inainte ca finalul acestora (inaintea lui return()).
Pentru variabilele statice sau globale destructorul este apelat inainte de terminarea programului. Atentie: cand un program este interrupt prin utilizarea unei secvente exit() destructorii sunt chemati doar pentu obiectele globale existente in momentul respective. Pentru obiectele definite local, in acesta situatie de fortare a terminarii, nu se face apelul!!!

26

C2: Introducere in programarea obiectuala


7. Functii membru si obiecte de tip const :
in C: in C++: #define MAX 100 int const max = 100;

Cuvantul cheie (rezervat) const apare uneori dupa lista de argumente a unor metode. Este utilizat pentru a specifica faptul ca functia membru respective nu modifica (nu altereaza) campurile de date ale obiectului sau, doar le citeste sau utilizeza.

Exemplu:
class dreptunghi { private: int lun; int lat; public: int get_lun(void) const; int get_lat(void) const; }
27

// nu este necesar

C2: Introducere in programarea obiectuala

//atributul trebuie sa apara si in definitia functiei: int Dreptunghi::get_lun() const { return (lun); } int Dreptunghi::get_lat() const { return (lat); }

//Nu se modifica valoarea datelor clasei. Expresii de genul: //lun = 0; // determina erori la compilare

28

C2: Introducere in programarea obiectuala


Scopul acestora: Functiile membru de tip const exista deoarece C++ permite crearea unor obiecte de tip const sau a unor referinte catre obiecte de tip const ce vor fi transmise ca parametri.
Pentru astfel de obiecte pot fi apelate doar metode const ce nu odifica datele. Singura exceptie de la aceasta regula este facuta doar de constructori si de destructor apelati automat. Posibilitatea apelarii constructorilor si destructorului este comparabila cu defitia unei variabile: int const max = 10 Dreptunghi const sablon(4,3); sablon.set_lun(6); // alta definitie Dreptunghi const sablon1(4, 3), sablon1(7, 8);
29

// nu este posibil

C2: Introducere in programarea obiectuala


8. Operatorii new si delete:
Utilizati pentru a aploca si dealoca (elibera) spatiu de memorie - dinamic. new aloca spatiu; delete elibereaza spatiu ; new si delete sunt operatori si nu necesita paranteze () ca in cazul functiilor malloc() si free(). new returneaza un pointer de tipul cerut (int, float, oarecare) catre o zona de memorie; delete returneaza void;

Exemplu:
int *ip; ip = new int; //.. delete ip;
30

C2: Introducere in programarea obiectuala


Alocarea si eliberarea spatiului pentru tablouri:
int

*int_tab; int_tab = new int[20]; // aloca 20 de intregi //


delete [] int_tab; // elibereaza spatiu de memorie

Prezenta parantezelor patrate [ ] in alocare (new) necesita prezenta sa la dealocare (delete). Lipsa in zona dealocarii a [ ] duce la eliberarea incomplecta a memoriei.
Person *pp; pp = new Person; delete pp; //ptr la un obiect Person //construit obiectul constructor fara parametri //distrus
31

C2: Introducere in programarea obiectuala


Person *pp; //ptr la un obiect Person

pp = new Person(Ion, Delea Veche, 10); //constructor cu parametri delete pp; //now destroyed

Person *pers_tab; pers_tab = new Person [10]; //.. delete []pers_tab;

32

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