This shows you the differences between two versions of the page.
poo-is-ab:laboratoare:02 [2024/10/07 10:28] razvan.cristea0106 [Cuvântul cheie struct] |
poo-is-ab:laboratoare:02 [2025/01/19 22:28] (current) razvan.cristea0106 |
||
---|---|---|---|
Line 12: | Line 12: | ||
* creeze și să implementeze funcții membre pentru o clasă, înțelegând rolul acestora în manipularea datelor | * creeze și să implementeze funcții membre pentru o clasă, înțelegând rolul acestora în manipularea datelor | ||
* scrie un program complet în C++ care să conțină o clasă, respectând principiile POO | * scrie un program complet în C++ care să conțină o clasă, respectând principiile POO | ||
+ | |||
==== Introducere ==== | ==== Introducere ==== | ||
Line 60: | Line 61: | ||
<note important>Se poate observa deja o diferență între modul de utilizare a structurii în limbajele C și C++. Compilatorul de C++ recunoaște structura **Avion** ca un tip de date definit de către programator, permițând crearea de instanțe ale acesteia fără a fi necesară utilizarea cuvântului cheie **struct** în declarație.</note> | <note important>Se poate observa deja o diferență între modul de utilizare a structurii în limbajele C și C++. Compilatorul de C++ recunoaște structura **Avion** ca un tip de date definit de către programator, permițând crearea de instanțe ale acesteia fără a fi necesară utilizarea cuvântului cheie **struct** în declarație.</note> | ||
- | În limbajul C pentru a putea avea programul identic cu cel de mai sus trebuie să procedăm în felul următor. | + | În limbajul C pentru a putea avea programul identic cu cel de mai sus trebuie să procedăm astfel. |
<code c> | <code c> | ||
Line 95: | Line 96: | ||
</code> | </code> | ||
- | De acum înainte când vom discuta despre structuri ne vom referi doar la cele din limbajul C++. Variabilele **numarLocuri**, **anFabricatie** și **capacitateRezervor** poartă denumirea de câmpuri sau membri, deoarece se găsesc în interiorul declarației structurii **Avion**. Prin intermediul operatorului **"."** am avut acces **direct** la acești membri pe care am putut să îi modificăm și mai apoi i-am folosit la afișarea avionului în funcția **main**. | + | De acum înainte când vom discuta despre structuri ne vom referi **doar** la cele din limbajul **C++**. Variabilele **numarLocuri**, **anFabricatie** și **capacitateRezervor** poartă denumirea de **câmpuri** sau **membri**, deoarece se găsesc în interiorul declarației structurii **Avion**. Prin intermediul operatorului **"."** am avut acces **direct** la acești membri pe care am putut să îi modificăm și mai apoi i-am folosit la afișarea avionului în funcția **main**. |
Până aici nu este nimic nou față de ce știați deja de la disciplinele **PCLP** și respectiv **PA**. Cu toate acestea care este diferența fundamentală între structura din C și cea din C++? Răspunsul îl vom afla mai târziu după ce vom înțelege ce este **Programarea Orientată Obiect**. | Până aici nu este nimic nou față de ce știați deja de la disciplinele **PCLP** și respectiv **PA**. Cu toate acestea care este diferența fundamentală între structura din C și cea din C++? Răspunsul îl vom afla mai târziu după ce vom înțelege ce este **Programarea Orientată Obiect**. | ||
Line 101: | Line 102: | ||
==== Programarea Orientată pe Obiecte (POO) ==== | ==== Programarea Orientată pe Obiecte (POO) ==== | ||
- | **Programarea Orientată Obiect**, tradusă din englezescul **Object-Oriented Programming (OOP)**, este un nou mod de a scrie și a organiza codul sursă, practic o nouă paradigmă de programare așa cum am mai menționat anterior. **POO** oferă o modalitate mai intuitivă și mai naturală de a învăța programarea, deoarece reflectă într-o anumită măsură modul în care percepem lumea reală. În POO, conceptele din viața de zi cu zi, cum ar fi obiectele și relațiile dintre ele, sunt transpuse în cod prin **clase** și **obiecte**. Astfel, programatorii pot modela entități reale, fiecare având **atribute** (**proprietăți/câmpuri/membri**) și **comportamente** (**funcții membre/metode**), aceasta fiind o modalitate prin care programarea a devenit mai ușor de înțeles și de gestionat. Această abordare modulară simplifică dezvoltarea de aplicații complexe și încurajează reutilizarea codului. | + | **Programarea Orientată Obiect**, tradusă din englezescul **Object-Oriented Programming (OOP)**, este un nou mod de a scrie și a organiza codul sursă, practic o nouă paradigmă de programare așa cum am mai menționat anterior. **POO** oferă o modalitate mai intuitivă și mai naturală de a învăța programarea, deoarece reflectă într-o anumită măsură modul în care percepem lumea reală. În **POO**, conceptele din viața de zi cu zi, cum ar fi obiectele și relațiile dintre ele, sunt transpuse în cod prin **clase** și **obiecte**. Astfel, programatorii pot modela entități reale, fiecare având **atribute** (**proprietăți/câmpuri/membri**) și **comportamente** (**funcții membre/metode**), aceasta fiind o modalitate prin care programarea a devenit mai ușor de înțeles și de gestionat. Această abordare modulară simplifică dezvoltarea de aplicații complexe și încurajează reutilizarea codului. |
=== Principiile POO === | === Principiile POO === | ||
Line 135: | Line 136: | ||
== Încapsularea == | == Încapsularea == | ||
- | Încapsularea se referă la modul în care o clasă își protejează datele, ascunzându-le de mediul exterior. Cu alte cuvinte nu putem modifica membrii unei clase direct, deoarce avem nevoie de acces la aceștia. | + | Încapsularea se referă la modul în care o clasă își protejează datele, ascunzându-le de mediul exterior. Cu alte cuvinte nu putem modifica membrii unei clase direct, deoarece avem nevoie de acces la aceștia. |
- | Pentru a înțelege ce presupune încapsularea trebuie să menționăm mai întâi ce sunt **specificatorii de acces** ai unei clase în C++. **Specificatorii de acces** sunt cuvinte cheie prin intermediul cărora se poate decide dacă membrul unei clase poate fi vizibil în exteriorul acesteia sau nu. | + | Pentru a înțelege ce presupune încapsularea trebuie să menționăm mai întâi ce sunt **specificatorii de acces** ai unei clase în C++. **Specificatorii de acces**, în C++, sunt cuvinte cheie prin intermediul cărora se poate decide dacă membrul unei clase poate fi vizibil în exteriorul acesteia sau nu. |
- | În C++ există 3 specificatori de acces și anume: **private**, **protected**, **public**. | + | În limbajul C++ există 3 specificatori de acces și anume: **private**, **protected**, **public**. |
**Specificatorul de acces private** | **Specificatorul de acces private** | ||
Line 305: | Line 306: | ||
=== Lucrul cu clase === | === Lucrul cu clase === | ||
- | În această secțiune vom descoperi modul în care putem controla accesul la membrii unei clase. Pentru a permite accesul la membrii unei clase din exterior, este necesar să folosim funcții speciale definite în **zona publică** a clasei, cunoscute sub denumirea de **metode** sau **funcții membre**. În continuare, vom prezenta câteva categorii de funcții membre care facilitează interacțiunea controlată cu membrii clasei din exterior. | + | În această secțiune vom descoperi modul în care putem controla accesul la membrii unei clase. Pentru a permite accesul la membrii unei clase din exterior, este necesar să folosim funcții speciale definite în **zona publică** a clasei, cunoscute sub denumirea de **metode** sau **funcții membre**. În continuare, vom prezenta câteva categorii de funcții membre care facilitează interacțiunea controlată cu membrii clasei din exteriorul acesteia. |
== Constructorii == | == Constructorii == | ||
Line 426: | Line 427: | ||
La prima vedere suntem mirați de faptul că avem o eroare de compilare, deoarece în mod normal ne-am aștepta ca variabila **inaltime** din partea stângă a egalului să fie de fapt membrul **inaltime** din zona privată a clasei **Brad**, însă din păcate nu este vorba despre membrul din zona privată ci despre însuși parametrul constructorului. Practic noi am încercat să îi atribuim parametrului propria valoare, dar compilatorul ne-a salvat prin atenționarea că nu putem modifica valoarea constantă a unui parametru. | La prima vedere suntem mirați de faptul că avem o eroare de compilare, deoarece în mod normal ne-am aștepta ca variabila **inaltime** din partea stângă a egalului să fie de fapt membrul **inaltime** din zona privată a clasei **Brad**, însă din păcate nu este vorba despre membrul din zona privată ci despre însuși parametrul constructorului. Practic noi am încercat să îi atribuim parametrului propria valoare, dar compilatorul ne-a salvat prin atenționarea că nu putem modifica valoarea constantă a unui parametru. | ||
- | În cazul de față este vorba despre o situație de ambiguitate în care compilatorul nu șție că de fapt noi vrem să stocăm valoarea parametrului constructorului în membrul clasei **Brad**. Cum putem totuși să rezolvăm această problemă pentru a ne putea îndeplini obiectivul și anume acela de a stoca valoarea trimisă ca parametru în câmpul clasei? | + | În cazul de față este vorba despre o situație de ambiguitate în care compilatorul nu știe că de fapt noi vrem să stocăm valoarea parametrului constructorului în membrul clasei **Brad**. Cum putem totuși să rezolvăm această problemă pentru a ne putea îndeplini obiectivul și anume acela de a stoca valoarea trimisă ca parametru în câmpul clasei? |
**Cuvântul cheie this** | **Cuvântul cheie this** | ||
Line 432: | Line 433: | ||
Pentru a putea soluționa problema de mai sus trebuie să introducem un nou keyword specific **POO** pe care îl vom întâlni în aproape toate limbajele de programare care suportă paradigma **OO** și anume cuvântul cheie **this**. | Pentru a putea soluționa problema de mai sus trebuie să introducem un nou keyword specific **POO** pe care îl vom întâlni în aproape toate limbajele de programare care suportă paradigma **OO** și anume cuvântul cheie **this**. | ||
- | În C++ **this** este un pointer pe care **toate funcțiile membre** îl primesc ca parametru pe prima poziție. În C++ acest pointer **nu este vizibil (dar asta nu înseamnă că nu există)** în lista de parametri ai metodei, dar în limbajul Python acesta este prezent și poartă denumirea de **self** și obligatoriu trebuie pus de către **programator** pe **prima poziție** în lista de parametri a fiecărei **funcții membre** dintr-o clasă. | + | În C++ **this** este un **pointer** pe care **toate funcțiile membre** îl primesc ca parametru pe **prima poziție**. În C++ acest pointer **nu** este vizibil, **dar asta nu înseamnă că nu există**, în lista de parametri a metodei, dar în limbajul Python acesta este prezent și poartă denumirea de **self** și obligatoriu trebuie pus de către **programator** pe **prima poziție** în lista de parametri a fiecărei **funcții membre** dintr-o clasă. |
Pointerul **this** indică **adresa obiectului curent** și are rolul de a **rezolva** problemele de ambiguitate între **membrii clasei** și **parametrii metodelor**. Acesta este utilizat pentru a **diferenția** în mod clar variabilele locale de câmpurile obiectului, permițând atribuirea **corectă** a valorilor parametrilor metodelor **membrilor interni** ai obiectului. | Pointerul **this** indică **adresa obiectului curent** și are rolul de a **rezolva** problemele de ambiguitate între **membrii clasei** și **parametrii metodelor**. Acesta este utilizat pentru a **diferenția** în mod clar variabilele locale de câmpurile obiectului, permițând atribuirea **corectă** a valorilor parametrilor metodelor **membrilor interni** ai obiectului. |