Curs C++ | Sectiunea 30 – Concepte de baza POO
🧰 Limbajul C++ a fost creat ca fiind o unealta universala pentru programarea orientata pe obiecte. Acest lucru nu inseamna ca nu poate fi folosit si pentru programarea procedurala, insa nu acesta este scopul principal.
🗺️ In cazul programarii procedurale, distingem doua lumi distincte si separate: lumea datelor si lumea codului. Lumea datelor este reprezentata de variabile de diferite tipuri, iar lumea codului este reprezentata de cod grupat in functii.
📜 Programarea orientata pe obiecte are pe de alta parte, un mod total diferit de gandire. Datele si codul sunt inchise impreuna in aceeasi lume, impartita pe clase. Fiecare clasa este ca o reteta ce poate fi folosita atunci cand ne dorim sa cream un nou obiect.
Fiecare obiect are un set de proprietati si este capabil sa execute un set de activitati, numite metode.
Ce este o Clasa?
❓ Cuvantul “clasa” poate avea multe sensuri, insa nu toate sunt compatibile cu ideile noastre. In cazul nostru specific, o clasa este ca o categorie, sau un gen. Este ca o colectie a tuturor posibilelor entitati conectate prin asemanari perfect definite.
🚙 Sa ne gandim spre exemplu la vehicule. In primul rand trebuie sa le definim suficient cat sa fie unice si reprezentative. Putem spune ca sunt entitati create artificical de noi cu scopul de a ajunge din puncul A in punctul B, transportand fiinte sau materiale.
Clasa vehicul este ceva prea general totusi, avem nevoie sa definim clase mai specializate. Deducem de aici 2 noi termeni. Clasa vehicul poate fi numita super-clasa iar clasele specializate pot fi numite sub-clase.
📝 Ierarhia claselor creste de sus pana jos, precum radacinile. Cea mai generala clasa este mereu sus in timp ce descendetii se afla sub.
Putem da cateva exemple de clase specializate pentru clasa noastra vehicul. Spre exemplu, vehicule de teren, de apa, de aer, spatiale etc. Putem merge si mai departe si crea sub-clase pentru cele mentionate.
🏎️ Spre exemplu putem specializa si mai mult vehiculele de teren, adaugand vehicule cu 2 roti, cu 4 roti, pe sine etc.
Bineinteles, putem da un exemplu similar folosind o clasa animal pe care sa o specializam. In realiate sunt o infinitate de exemple, puteti incerca singuri sa gasiti un exemplu diferit.
Ce este un Obiect?
💡 O clasa este un set de obiecte. Un obiect reprezinta o entitate ce apartine unei clase. Putem spune ca este intruchiparea cerintelor, trasaturilor si calitatilor specifice unei clase.
📝 Daca un obiect aparitine unei anumite clase, putem spune ca acesta apartine tuturor super-claselor in acelasi timp. De asemenea, un obiect ce apartine unei super-clase, poate sa nu aparinta unei sub-clase.
Folosind exemplul nostru cu vehicule putem spune ca masina noastra apartine clasei “Vehicule 4 Roti“. Dar acest lucru inseamna ca aceeasi masina apartine si super-clasei “Vehicule de teren” si mai mult, apartine si super-clasei “Vehicule“.
❗ Spunem ca fiecare sub-clasa este mai specializata (mai specifica) decat super-clasele ei. Pe de alta parte, orice super-clasa este mai generala (mai abstracta) decat sub-clasele ei.
Mostenire
💡 Unul din conceptele fundamentale in acest tip de programare poarta numele de mostenire (inheritance). Orice obiect atasat de un nivel specific al ierarhiei unei clase, mosteneste toate trasaturile definite in interiorul oricarei super-clase.
Clasa in cauza, poate la randul ei sa defineasca noi trasaturi si caracteristici, ce vor fi mostenite de oricare din sub-clasele ei.
👪 Un exemplu pentru acest concept suntem chiar noi. Mereu ne uitam la copii si spunem, a mostenit ochii mamei sau parul tatalui. Este ceva adevarat valabil ce se intampla si in natura, asa ca nu trebuie sa vi se para ciudat ca putem aplica acest fenomen la un cod 🙂 .
Trasaturile oricarui obiect
Orice obiect poate fi echipat cu trei atribute:
- nume ce identifica in mod unic un obiect in interiorul unui name space
- set de proprietati individuale ce fac obiectul original (desi se poate intampla ca un obiect sa nu aiba nicio proprietate)
- set de abilitati cu rolul de a indeplini activitati ce pot schimba obiectul in sine sau alte obiecte
❗ Clasa pe care o cream nu are nicio legatura cu crearea unui obiect. Existenta unei clase nu inseamna ca obiectele compatibile vor fi create automat. Pentru a crea un obiect, trebuie sa facem acest lucru manual.
Definirea unei clase se realizeaza in felul urmator:
Incepem folosind keyword-ul class, urmat de un identificator ce reprezinta numele acesteia. A nu se confunda numele clasei cu numele unui obiect, fiind doua lucruri total diferite. Mai departe adaugam o pereche de acolade, in interior urmand sa definim caracteristicile clasei.
💡 Noua clasa definita devine echivalentul unui tip de date ce poate fi folosit corespunzator. Daca ne dorim sa cream un obiect de tip MyClass vom folosim aceeasi modalitate ca si in cazul tipurilor de baza.
Vom spune ca am creat un obiect cu numele my_object de tip MyClass.
Aici se termina si aceasta sectiune insa povestea despre OOP abia a inceput 🙂 . Daca aveti intrebari suplimentare puteti folosi informatiile de aici. Diagramele au fost realizate folosind limbajul PlantUML.
➡ Sectiunea anterioara:Curs C++ | Sectiunea 29 – Name spaces
➡ Sectiunea urmatoare:Curs C++ | Sectiunea 31 – Implementare Procedurala Stack

