This shows you the differences between two versions of the page.
poo-is:laboratoare:02 [2020/09/07 15:34] sergiu.craioveanu |
poo-is:laboratoare:02 [2020/10/01 12:27] (current) alexandru.ionita99 [3. Functii membre ale unei structuri] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Laboratorul 02: Elemente specifice C++ ===== | + | ====== Laboratorul 02: Elemente Specifice C++ ====== |
+ | |||
+ | Laboratorul de azi are ca scop acomodarea voastra cu limbajul C++. Asta presupune tranzitia de la limbajul C, dar si intelegerea conceptelor elementare, noi, ce tin de C++. Asadar, materialul de astazi poate fi vazut ca un fel de 'Crash Course' pentru C++. El reprezinta minimul necesar care trebuie stiut pentru a intelege continutul laboratoarelor urmatoare, dar nu elimina necesitatea voastra de a exersa cu limbajul pentru a deveni familiari cu acesta. | ||
Inainte de fiecare laborator, vom prezenta surse aditionale de informare, unde veti putea gasi explicatii suplimentare si exemple concrete. | Inainte de fiecare laborator, vom prezenta surse aditionale de informare, unde veti putea gasi explicatii suplimentare si exemple concrete. | ||
Line 6: | Line 8: | ||
* Capitolul 1 (Chapter 1. pag 1-45): C++ Basics | * Capitolul 1 (Chapter 1. pag 1-45): C++ Basics | ||
* Capitolul 2 (Chapter 2. pag 45-99): Flow of Control (if-else, for etc) | * Capitolul 2 (Chapter 2. pag 45-99): Flow of Control (if-else, for etc) | ||
+ | * Capitolul 10 (Chapter 10. pag 419-471): Pointers and Dynamic Arrays | ||
Line 44: | Line 47: | ||
</code> | </code> | ||
- | ===== 3. Functii Inline ===== | + | ===== 3. Functii membre ale unei structuri ===== |
+ | |||
+ | Pentru a modifica campurile unei variabile de tip struct, putem utiliza **functiile membre** (**metode**). Aceste functii au urmatoarele caracteristici: \\ | ||
+ | * variabila struct asupra careia se lucreaza **nu** este data ca parametru | ||
+ | * nu cresc dimensiunea tipului de date | ||
+ | * au acces direct la campurile structurii, inclusiv cele declarate **private** | ||
+ | |||
+ | Vom prezenta un exemplu de utilizare al acestor functii. Utilitatea lor se va vedea mai bine in cazul programarii obiectuale. \\ | ||
+ | Exemplul poate fi rulat [[https://repl.it/@alexionita99/lab2struct|aici]] | ||
+ | |||
+ | <code cpp> | ||
+ | #include <iostream> | ||
+ | #include <cstdlib> | ||
+ | |||
+ | using namespace std; | ||
+ | |||
+ | struct point{ | ||
+ | private: //altfel, sunt implicit public | ||
+ | int x; | ||
+ | int y; | ||
+ | public: //pentru a fi vizibile de oriunde | ||
+ | void modificare(int, int); //implementarile functiilor se face | ||
+ | void afisare(); //dupa definirea structurii | ||
+ | }; | ||
+ | |||
+ | //Implementarea metodelor din struct | ||
+ | void point::modificare(int xx, int yy) | ||
+ | { | ||
+ | x = xx; //functiile membre au acces la campurile private | ||
+ | y = yy; | ||
+ | } | ||
+ | |||
+ | void point::afisare() | ||
+ | { | ||
+ | cout << x << " " << y << endl; | ||
+ | } | ||
+ | |||
+ | |||
+ | int main() | ||
+ | { | ||
+ | point p; //declararea unei variabile de tip struct point | ||
+ | |||
+ | //Apelam metodele pentru variabila p. Nu o dam ca parametru: | ||
+ | |||
+ | p.afisare(); //va afisa ce se afla in memorie, la adresele campurilor x si y | ||
+ | |||
+ | p.modificare(3, 3); //modificam valorile lui x si y folosind functia membra | ||
+ | |||
+ | p.afisare(); //va afisa noile valori 3 si 3 | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | </code> | ||
+ | ===== 4. Functii Inline ===== | ||
O functie inline e definita in felul urmator: | O functie inline e definita in felul urmator: | ||
Line 78: | Line 135: | ||
- | ===== 4. Supradefinirea functiilor ===== | + | ===== 5. Supradefinirea functiilor ===== |
In C++ este permisa supradefinirea functiilor, adica existenta mai multor functii cu acelasi nume, dar care difera prin tipul si/sau numarul parametrilor. Decizia de a apela o | In C++ este permisa supradefinirea functiilor, adica existenta mai multor functii cu acelasi nume, dar care difera prin tipul si/sau numarul parametrilor. Decizia de a apela o | ||
functie sau alta se face dupa tipul sau numarul parametrilor. | functie sau alta se face dupa tipul sau numarul parametrilor. | ||
Line 121: | Line 178: | ||
</code> | </code> | ||
- | ===== 5. Operatorii de scriere (>>) si citire (<<) ===== | + | ===== 6. Operatorii de scriere (>>) si citire (<<) ===== |
Prin acesti operatori se pot face scrieri si citiri la consola in formate predefinite. Aceasta ne scuteste de folosirea functiilor de tip printf/scanf etc. si ofera o forma comoda de I/O. | Prin acesti operatori se pot face scrieri si citiri la consola in formate predefinite. Aceasta ne scuteste de folosirea functiilor de tip printf/scanf etc. si ofera o forma comoda de I/O. | ||
Line 144: | Line 201: | ||
- | ===== 6. Tipul referinta ===== | + | ===== 7. Tipul referinta ===== |
O declaratie de forma | O declaratie de forma | ||
Line 210: | Line 267: | ||
</code> | </code> | ||
- | ===== 7. Alocari dinamice de memorie ===== | + | ===== 8. Alocari dinamice de memorie ===== |
Alocarea de memorie se face in C++ cu operatorul **new** (care face parte din limbaj). | Alocarea de memorie se face in C++ cu operatorul **new** (care face parte din limbaj). | ||
Enumeram urmatoarele forme de alocare: | Enumeram urmatoarele forme de alocare: | ||
Line 254: | Line 311: | ||
</code> | </code> | ||
- | Metoda prezentata mai sus este nefolosita in industrie, tipul ** char* ** fiind inlocuit de tipul C++ **string**. Pentru mai multe detalii asupra clasei **string**, click [[https://www.tutorialspoint.com/cplusplus/cpp_strings.htm|aici]]. De asemenea, inspectati resursele utile pentru explicatii suplimentare, dar si exemple concrete. | + | Metoda prezentata mai sus este nefolosita in industrie, tipul ** char* ** fiind inlocuit de tipul C++ **string**. Pentru mai multe detalii asupra clasei **string**, click [[https://www.tutorialspoint.com/cplusplus/cpp_strings.htm|aici]]. De asemenea, puteti inspecta Capitolul 9 (Chapter 9, pag 367-) : Strings, din cartea [[https://discourse-production.oss-cn-shanghai.aliyuncs.com/original/3X/2/3/2380479dcb8e375425884a10da232730bbc7f88d.pdf|Absolute C++]] pentru explicatii suplimentare, dar si exemple concrete. |
- | ===== 8. Functii cu parametri impliciti ===== | + | ===== 9. Functii cu parametri impliciti ===== |
Functia print_tab de mai jos are trei parametri, dintre care ultimul este de tip pointer la char, care este initializat implicit pe sirul constant "Mesaj implicit". | Functia print_tab de mai jos are trei parametri, dintre care ultimul este de tip pointer la char, care este initializat implicit pe sirul constant "Mesaj implicit". | ||
Line 275: | Line 332: | ||
</code> | </code> | ||
- | ===== 9. Experiment ===== | + | ===== 10. Experiment ===== |
Ca sa testati toate conceptele prezentate in acest laborator, rulati codul de mai jos apasand [[https://repl.it/@thesergiu/lab2experiment#main.cpp|aici]]. | Ca sa testati toate conceptele prezentate in acest laborator, rulati codul de mai jos apasand [[https://repl.it/@thesergiu/lab2experiment#main.cpp|aici]]. | ||