Curs C++ | Sectiunea 34 – Anatomia unei Clase
💡 O clasa reprezinta un agregat compus din variabile (membrii) si functii (metode). Atat membrii cat si metodele sunt componentele clasei.
❗ In cazul in care componentele unei clase sunt declarate fara a folosi specificatori de acces (public sau private), acestea for fi considerate automat ca private. Spre exemplu urmatoarea clasa
este echivalenta cu a scrie:
Specificatori de acces
Am reconstruit clasa anterioara pentru a pune in evidenta acesti specificatori de acces. Totodata, am adaugat inca o metoda pentru a seta valoarea, numita setValue.
🥷Veti observa ca am lasat metodele setValue si getValue ca publice, fiind accesibile utilizatorilor clasei iar membrul value este acum privat, fiind ascuns. In acest fel, singurul mod prin care il putem accesa este folosind cele doua metode.
Crearea si folosirea unui obiect
🌌 Crearea se realizeaza simplu, specificand numele clasei si numele obiectului pe care il dorim. Este foarte asemanatoare cu procesul de creare al unei variabile normale, precum un tip int, char etc, cel putin pentru moment 🙂 .
💡 Orice obiect al unei clase este echipat cu toate componentele definite in interiorul clasei. Putem spune deci ca myObj contine cele trei componente definite anterior.
Componentele publice sunt disponibile pentru utilizatori si pot fi folosite:
In schimb, componentele private sunt ascunse, fiind disponibile doar in interiorul clasei. Folosirea lor din exterior ducand la erori precum int A::value is private within this context .
Suprascrierea numelui unei componente
💡 Definirea unei metode poate fi facuta atat in interiorul clasei cat si in afara ei. O metoda are acces total la toate celelalte componente alei clasei, inclusiv cele private.
❗ Daca o metoda introduce o entitate cu un nume identic cu o componenta a clasei, numele componentei este suprascris. Poate fi accesat numai prin calificare cu numele clasei, folosind operatorul scope.
Spre exemplu, metoda setValue are un parametru numit value, fiind identic cu membrul clasei numit tot value. Astfel ca daca facem urmatoarea asignare:
Aceasta va fi aplicata pe valoarea parametrului, neavand nicio legatura cu componenta noastra interna.
❗ O metoda corecta de a face aceasta asignare este, asa cum am spus anterior, prin calificarea componentei cu numele clasei.
Astfel, metoda noastra va arata in felul urmator:
Pointer-ul this
💡 Fiecare obiect este echipat cu o componenta speciala avand urmatoarele proprietati:
- numele acesteia este this
- nu poate fi declarat explicit (fiind un keyword) astfel ca nu poate fi suprascris
- este un pointer catre obiectul curent – fiecare obiect are propria copie a pointer-ului this
📜 Avem urmatoarea regula generala: Daca S este o structura sau o clasa ce are o componenta C, iar P este un pointer catre un S, atunci C poate fi accesat folosind doua metode diferite.
Stiind acest lucru, putem aduce o noua solutie pentru problema suprascrierii numelui unei componente. Astfel, clasa noastra va arata in felul urmator:
Calificarea numelui unei componente
💡 In cazul in care o metoda a unei clase este definita in afara clasei, numele acesteia trebuie calificat cu numele clasei folosind operatorul scope “::“.
O metoda definita in acest mod, are in continuare acces total la toate componentele din ineriorul clasei. Toate regulile pentru suprascrierea numelor sunt valabile de asemenea.
🔥 Metodele clasei pot la randul lor sa fie supraincarcate (overloaded) ca si in cazul unor functii normale. Putem chiar folosi o valoare default pentru un parametru.
In exemplul anterior avem doua metode cu acelasi nume, setValue. Prima are un parametru iar a doua nu are niciunul, in schimb atribuie o valoare default membrului value.
AIci se termina si aceasta sectiune. Vom continua in urmatoarea folosind aceeasi clasa creata ca exemplu dar vom adauga si notiunea de constructori si destructori 🙂 .
➡ Sectiunea anterioara:Curs C++ | Sectiunea 33 – Mostenire Clasa Stack

