Clase III Programarea calculatoarelor i limbaje de programare
Clase (III) Programarea calculatoarelor şi limbaje de programare II Capitolul 3
Introducere n Vom prezenta în acest capitol n compunerea claselor n noţiunile de clase friend şi funcţii friend n pointerul this n modul în care obiectele pot fi create şi sterse dinamic
Sumar n Compunerea claselor: Obiecte ca membri ai claselor n Accesul la datele membre: public și private. Funcţii friend n Pointerul this n Alocarea dinamică a memoriei cu operatorii new şi delete
Compunerea claselor: Obiecte ca membri ai claselor n Exemplu de compunere a claselor n Dorim să formăm segmente care sunt determinate de câte două puncte n O idee de proiectare a acestei clase ar fi includerea a două obiecte Punct ca membri ai clasei Segment n O clasă poate conţine ca date membre obiecte altor clase = Compunere de clase
Compunerea claselor: Obiecte ca membri ai claselor class Segment{ public: Segment(Punct pct 1, Punct pct 2) : p 1(pct 1), p 2(pct 2) Inițializarea obiectelor {} Punct getp 1(){return p 1; } Punct getp 2(){return p 2; } private: Punct p 1; Compunere de clase Punct p 2; };
Compunerea claselor: Obiecte ca membri ai claselor class Punct{ public: Punct(double x, double y){ set. X(x); set. Y(y); } double get. X(){return x; } void set. X(double x){this->x = x; } double get. Y(){return y; } void set. Y(double y){this->y = y; } private: double x; double y; };
Compunerea claselor: Obiecte ca membri ai claselor n Propuneți câte o variantă de proiectare a claselor Cerc și Triunghi
Compunerea claselor: Obiecte ca membri ai claselor n Diferenţa dintre asocierea simplă şi compunere este dată de perioada de existenţă a obiectelor implicate n Compunerea n n obiectele fac parte integrantă din clasa care reprezintă întregul şi perioadele lor de existenţă coincid Întregul este responsabil de crearea şi distrugerea obiectelor care intră în compunerea lui n Asocierea n obiectele parte şi întreg pot avea perioade de existenţă diferite n În C++, asocierea poate fi modelată prin n includerea în clasa întreg a unor referinţe la obiecte din alte clase n folosirea de către funcţiile membre ale clasei întreg de parametri de tipul claselor parte
Sumar n Compunerea claselor: Obiecte ca membri ai claselor n Accesul la datele membre: public și private. Funcţii friend n Pointerul this n Alocarea dinamică a memoriei cu operatorii new şi delete
Compunerea claselor: Obiecte ca membri ai claselor class Punct{ public: Punct(double x, double y){ set. X(x); Secțiune public set. Y(y); } double get. X(){return x; } void set. X(double x){this->x = x; } double get. Y(){return y; } void set. Y(double y){this->y = y; } private: double x; Secțiune private double y; };
Compunerea claselor: Obiecte ca membri ai claselor class Segment{ public: Segment(Punct pct 1, Punct pct 2) : p 1(pct 1), p 2(pct 2) Membri public {} Punct getp 1(){return p 1; } Punct getp 2(){return p 2; } private: Punct p 1; Membri private Punct p 2; };
public, private int Intersectie(Segment sg 1, Segment sg 2){ double x 1 = sg 1. getp 1(). get. X(); double y 1 = sg 1. getp 1(). get. Y(); double x 2 = sg 1. getp 2(). get. X(); double y 2 = sg 1. getp 2(). get. Y(); double x 3 = sg 2. getp 1(). get. X(); double y 3 = sg 2. getp 1(). get. Y(); double x 4 = sg 2. getp 2(). get. X(); double y 4 = sg 2. getp 2(). get. Y(); bool conditie = true; if((x 1!=x 2) && (x 3!=x 4 double p 1 = (y 2 -y 1)/(x 2 -x 1); double p 2 = (y 4 -y 3)/(x 4 -x 3); if(p 1 == p 2) conditie = false; } return conditie; } x, y, p 1, p 2 sunt membri private Trebuie să ne folosim de funcții public pentru a obține valorile lor în funcții care nu fac parte din clasă
friend n Exemplu Declaraţie friend class Count { friend void set. X(Count&, int); public: Count(){ x = 0; } // constructor void print() const { cout << x << endl; }//iesire Funcţia set. X nu face private: parte din clasă int x; //data membra }; Este declarată friend ca să aibă void set. X( Count& c, int val ) aces direct la x care { c. x = val; } este private
friend int main() { Count counter; cout << "counter. x dupa instantiere: "; counter. print(); cout << "counter. x dupa apelul functiei friend set. X: "; set. X(counter, 8); counter. print(); return 0; } Rezultat: counter. x dupa instantiere: 0 counter. x dupa apelul functiei friend set. X: 8
Sumar n Compunerea claselor: Obiecte ca membri ai claselor n Accesul la datele membre: public și private. Funcţii friend n Pointerul this n Alocarea dinamică a memoriei cu operatorii new şi delete
Pointerul this n Fiecare obiect are acces la propria adresă de memorie prin intermediul pointerului numit this n Pointerul this al unui obiect nu este parte a obiectului n el nu este reflectat de rezultatul unei operaţii sizeof asupra sa n Pe de altă parte, this este introdus de compilator ca prim argument în fiecare apel al funcţiilor nestatice realizat de obiect
Pointerul this n Accesul membrilor clasei prin pointerul this n operatorul săgeată -> pentru pointerul this la obiect: this->x n operatorul punct. pentru pointerul this dereferenţiat: (*this). x n Folosirea parantezelor care încadrează pointerul dereferenţiat *this este obligatorie pentru că operatorul. are precedenţă mai mare decât *
Compunerea claselor: Obiecte ca membri ai claselor class Punct{ public: Punct(double x, double y){ set. X(x); set. Y(y); } double get. X(){return x; } void set. X(double x){this->x = x; } double get. Y(){return y; } void set. Y(double y){this->y = y; } private: double x; double y; };
Sumar n Compunerea claselor: Obiecte ca membri ai claselor n Accesul la datele membre: public și private. Funcţii friend n Pointerul this n Alocarea dinamică a memoriei cu operatorii new şi delete
Alocarea dinamică a memoriei cu operatorii new şi delete n Transmiterea unor valori pentru iniţializarea obiectelor create dinamic: double *thing. Ptr = new double(3. 1415927); n iniţializează noul obiect de tip double cu valoarea 3. 1415927 n Alocarea dinamică a tablourilor: int *array. Ptr = new int[10]; n Eliberarea memoriei alocate dinamic pentru tabouri: delete [] array. Ptr;
- Slides: 20