Differences

This shows you the differences between two versions of the page.

Link to this comparison view

poo-is-ab:laboratoare:02 [2024/10/04 20:20]
razvan.cristea0106 [Programarea Orientată pe Obiecte (POO)]
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 56: Line 57:
 </​code>​ </​code>​
  
-Am creat o funcție auxiliară care primește ca parametru o referință constantă de tip **Avion**, pentru a afișa ​detaliile acestuia. Am transmis parametrul prin **referință** pentru a evita copierea inutilă a variabilei avion din funcția main. Referința este constantă deoarece nu dorim să modificăm câmpurile avionului în funcția de afișare.+Am creat o funcție auxiliarăcare primește ca parametru o **referință constantă** de tip **Avion**, pentru a afișa ​datele parametrului **avion**. Am transmis parametrul prin **referință** pentru a evita copierea inutilă a variabilei avion din funcția main. Referința este **constantă**, deoarece nu dorim să modificăm câmpurile avionului în funcția de afișare.
  
 <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 trebuia ​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 **PCLP** și **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**.
  
 ==== 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 prametri 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** ​pointează către ​**adresa obiectului curent** și are menirea ​de a rezolva problemele de ambiguitate, inclusiv problema noastră de mai sus, pentru a putea stoca valoarea parametrului ​în câmpul clasei.+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.
  
 Să soluționăm problema de mai sus utilizând pointerul **this**. Să soluționăm problema de mai sus utilizând pointerul **this**.
Line 597: Line 598:
 </​code>​ </​code>​
  
-Pentru a vă familiariza cu noul mod de a scrie codul, declarați și implementați un constructor cu doi parametri la alegere și în plus, implementați metodele de **get** și **set** pentru câmpul **pret** și apoi testați ce ați implementat în funcția **main**.+==== ==== 
 + 
 +Pentru a vă familiariza cu noul mod de a scrie codul, declarați și implementați un constructor cu doi parametri la alegere și în plus, implementați metodele ​accesor ​de tip **get** și **set** pentru câmpul **pret** și apoi testați ce ați implementat în funcția **main**.
  
 ==== Concluzii ==== ==== Concluzii ====
  
 În acest laborator, am explorat în detaliu diferențele fundamentale dintre clase și structuri, subliniind faptul că singura deosebire constă în specificatorul de acces implicit: la structuri, membrii sunt publici, iar la clase sunt privați. Totodată, am învățat cum să creăm obiecte și cum să le gestionăm proprietățile folosind constructori,​ precum și accesori prin intermediul getter-ilor și al setter-ilor. Acest lucru ne oferă un control mai fin asupra datelor și ne permite o manipulare clară și sigură a obiectelor într-un program care folosește conceptele **OOP**. Astfel, am dobândit o înțelegere mai bună a principiilor fundamentale ale **Programării Orientate Obiect**, principii pe care le vom aplica pe întregul parcurs al semestrului. În acest laborator, am explorat în detaliu diferențele fundamentale dintre clase și structuri, subliniind faptul că singura deosebire constă în specificatorul de acces implicit: la structuri, membrii sunt publici, iar la clase sunt privați. Totodată, am învățat cum să creăm obiecte și cum să le gestionăm proprietățile folosind constructori,​ precum și accesori prin intermediul getter-ilor și al setter-ilor. Acest lucru ne oferă un control mai fin asupra datelor și ne permite o manipulare clară și sigură a obiectelor într-un program care folosește conceptele **OOP**. Astfel, am dobândit o înțelegere mai bună a principiilor fundamentale ale **Programării Orientate Obiect**, principii pe care le vom aplica pe întregul parcurs al semestrului.
poo-is-ab/laboratoare/02.1728062422.txt.gz · Last modified: 2024/10/04 20:20 by razvan.cristea0106
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0