Master IT
Bine ati venit.Pe acest forum veti gasii tot ce va intereseaza din domeniul IT.Jocuri,filme,muzica,hackuri,tutoriale,tutoriale c++,tutoriale html,tutoriale java script,tutoriale mysql si multe altele.Va asteptam cu mare drag.WWW.MASTERIT.3XFORUM.RO WWW.MASTERIT.3XFORUM.RO WWW.MASTERIT.3XFORUM.RO
|
Nou pe simpatie: Cenusareasa
 | Femeie 24 ani Bucuresti cauta Barbat 28 - 61 ani |
|
|
Master ITReguliInregistrareLoginPozeNu sunteti logat. Lista Forumurilor Pe Tematici
|
| #1 |
spyrootAdministratorDin: Brasov
Postari: 76
|
|
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: Code: class NumeClasaDerivata: SpecificatorAcces NumeClasaDeBaza
unde SpecificatorAcces poate fi public sau private. 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:
Code:
:
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);
};
Se observa ca variabilele membru ale x si y sunt declarate protected, asa inmcat vor fi vizibi,le si vor avea acelasi atribut in clasa GraphicPoint( desi nu sunt utilizate). In mod normal, x si y ar trebui sa fie declarati private, intrucat nu sunt utilizati decat in interiorul clasei Point. Functiile din GraphicPoint nu acceseaza acesti doi membri direct, ci prin intermediul metodelor publice de accesare oferite de clasa Point.
Important de notat este faptul ca, implicit, daca nu este utilizat nici un specificator de accees, membrii sunt considerati private. |
Code:
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;
} |
Am demonstrat prin acest exemplu de program ca din exteriorul unei clase nu pot fi accesate datele membre private sau protected.
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:
Code:
:
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);
{
...
} |
Dupa cum se vede din exemplul de mai sus, nua re nici o importanta in cadrul carei sectiuni este declarata functia prietena. Clasele prietene sunt clase care au acces la membrii privati ai unei clase. Sintaxa declararii unei clase prietene este urmatoarea: friend class NumeClasaPrietena Exemplu:
Code:
class PrimaClasa{
...
};
class ADouaClasa{
...
friend class PrimaClasa;
}; |
In exemplul de mai sus, clasa PrimaClasa are acces la membrii privati ai clasei ADouaClasa. 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 !
_______________________________________ Cand esti baiat bun lumea tot de prost te ia.
|
|
| |
|