Tutorial C++ Controlul accesului la clase
Pagina 1 din 1
Tutorial C++ Controlul accesului la clase
Spre deosebire de limbajele orientate-obiect pure, C++ permite controlul accesului la membrii claselor. In acest scop, s-au creat trei specificatori de control ai accesului:
public: membrul poate fi accesat de orice functie din domeniul declaratiei clasei;
private: membrul este accesibil numai functiilor membre si prietene ale clasei;
protected: similar cu private, insa accesul se extinde si la functiile membre si prietene ale claselor derivate.
De remarcat este faptul ca o functie membra a unei clase are acces la toti membrii clasei, indiferent de specificatorul de acces.
Asadar, sintaxa declaratiei unei clase derivate incluzand controlul accesului este:
Pentru a oferi clasei derivate acces la un membru al clasei de baza, acesta trebuie declarat protected sau public. Pentru respectarea principiului incapsularii datelor, datele membre pentru care se ofera acces claselor derivate se declara in clasa de baza cu atributul protected. De asemenea, pentru a conversa dreptul de acces in urma derivarii, se utilizeaza public. Accesul poate fi stopat pe orice nivel al ierarhiei de clase printr-o derivare private.
Stabilirea atributelor de acces ale membrilor unei clase, precum si ale derivarilor, trebuie sa se faca astfel incat dezvoltarea ierarhiei de clase sa nu afecteze principiul incapsularii datelor.
Exemplu:
Important de notat este faptul ca, implicit, daca nu este utilizat nici un specificator de accees, membrii sunt considerati private.
Functii si clase prietene
In paragraful precedent, am afirmat ca principiul incapsularii datelor este bine de respectat in cadrul elaborarii ierarhiei de clase. Cu toate acestea, exista situatii in care este greu sa se respecte acest principiu. De accea, Bjarne Sroutstrup a introdus un concept menit sa rezolve si aceste situatii particulare, pentru a oferi solutii elegante in vederea rezolvarii tuturor situatiilor posibile. Acest concept este cel de friend, care permite practic abateri controlate de la ideea protejarii datelor prin incapsulare. Este de recomandat ca mecanismul friend sa fie folosit numai in cazul in care nu exista alta solutie!
Mecanismul friend( sau prietenie) a aparut datorita imposibilitatii de a face ca o metoda sa fie membra a mai multe clase.
Functiile prietene sunt functii care nu sunt metode ale unei clase, dar care au totusi acces la membrii privati ai acesteia. Orice functie poate fi prietena a unei clase, indiferent de natura acesteia.
Sintaxa declararii unei functii prietene in cadrul declaratiei unei clase este urmatoarea:
friend NumeFunctie
Un exemplu:
Clasele prietene sunt clase care au acces la membrii privati ai unei clase. Sintaxa declararii unei clase prietene este urmatoarea:
friend class NumeClasaPrietena
Exemplu
Important este sa remarcam ca relatia de prietenie nu este tranzitiva. Daca o clasa A este prietena cu o clasa B, iar clasa B este prietena cu o clasa C, aceasata nu inseama ca A este prietena cu C. De asemenea, proprietatea de prietenie nu se mosteneste in clasele derivate !
public: membrul poate fi accesat de orice functie din domeniul declaratiei clasei;
private: membrul este accesibil numai functiilor membre si prietene ale clasei;
protected: similar cu private, insa accesul se extinde si la functiile membre si prietene ale claselor derivate.
De remarcat este faptul ca o functie membra a unei clase are acces la toti membrii clasei, indiferent de specificatorul de acces.
Asadar, sintaxa declaratiei unei clase derivate incluzand controlul accesului este:
- Cod:
class NumeClasaDerivata: SpecificatorAcces NumeClasaDeBaza
Pentru a oferi clasei derivate acces la un membru al clasei de baza, acesta trebuie declarat protected sau public. Pentru respectarea principiului incapsularii datelor, datele membre pentru care se ofera acces claselor derivate se declara in clasa de baza cu atributul protected. De asemenea, pentru a conversa dreptul de acces in urma derivarii, se utilizeaza public. Accesul poate fi stopat pe orice nivel al ierarhiei de clase printr-o derivare private.
Stabilirea atributelor de acces ale membrilor unei clase, precum si ale derivarilor, trebuie sa se faca astfel incat dezvoltarea ierarhiei de clase sa nu afecteze principiul incapsularii datelor.
Exemplu:
- Cod:
class Point
{
protected:
unsigned x, y;
public:
Point();
Point(unsigned X, unsigned Y);
~Point();
unsigned long Arie();
unsiged GetX();
unsigned GetY();
void SetX(unsigned X);
void SetY(unsigned Y);
};
class GraphicPoint: public Point
{
unsigned color;
public:
GraphicPoint(unsigned X, unsigned Y, unsigned Color);
~GraphicPoint();
void Draw();
void SetX(unsigned X);
void SetY(unsigned Y);
};
Important de notat este faptul ca, implicit, daca nu este utilizat nici un specificator de accees, membrii sunt considerati private.
- Cod:
void main()
{
Point *p;
p = new Point;
p->x = 5; // operatie imposibila: x este membru privat
p->x = 6; // operatie imposibila: y este membru privat
p->SetX(3); /* corect: acces la variabila X se face prin intermediul functiei
SetX() */
p->SetY(6);
printf("Aria = %d\n", p->Aria());
delete p;
}
Functii si clase prietene
In paragraful precedent, am afirmat ca principiul incapsularii datelor este bine de respectat in cadrul elaborarii ierarhiei de clase. Cu toate acestea, exista situatii in care este greu sa se respecte acest principiu. De accea, Bjarne Sroutstrup a introdus un concept menit sa rezolve si aceste situatii particulare, pentru a oferi solutii elegante in vederea rezolvarii tuturor situatiilor posibile. Acest concept este cel de friend, care permite practic abateri controlate de la ideea protejarii datelor prin incapsulare. Este de recomandat ca mecanismul friend sa fie folosit numai in cazul in care nu exista alta solutie!
Mecanismul friend( sau prietenie) a aparut datorita imposibilitatii de a face ca o metoda sa fie membra a mai multe clase.
Functiile prietene sunt functii care nu sunt metode ale unei clase, dar care au totusi acces la membrii privati ai acesteia. Orice functie poate fi prietena a unei clase, indiferent de natura acesteia.
Sintaxa declararii unei functii prietene in cadrul declaratiei unei clase este urmatoarea:
friend NumeFunctie
Un exemplu:
- Cod:
class Point {
friend unsigned long Calcul(unsigned X, unsigned Y);
public:
fiend unsigned long AltaClasa::Calcul(unsigned X, unsigned Y);
...
};
unsigned long Calcul(unsigned X, unsigned Y)
{
return X * Y / 2;
}
unsigned long AltaClasa::Calcul(unsigned X, unsigned Y);
{
...
}
Clasele prietene sunt clase care au acces la membrii privati ai unei clase. Sintaxa declararii unei clase prietene este urmatoarea:
friend class NumeClasaPrietena
Exemplu
- Cod:
class PrimaClasa{
...
};
class ADouaClasa{
...
friend class PrimaClasa;
};
Important este sa remarcam ca relatia de prietenie nu este tranzitiva. Daca o clasa A este prietena cu o clasa B, iar clasa B este prietena cu o clasa C, aceasata nu inseama ca A este prietena cu C. De asemenea, proprietatea de prietenie nu se mosteneste in clasele derivate !
Pagina 1 din 1
Permisiunile acestui forum:
Nu puteti raspunde la subiectele acestui forum
|
|