This shows you the differences between two versions of the page.
poo-is:laboratoare:02 [2020/09/17 11:54] alexandru.ionita99 |
poo-is:laboratoare:02 [2020/10/01 12:27] (current) alexandru.ionita99 [3. Functii membre ale unei structuri] |
||
---|---|---|---|
Line 47: | 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 81: | 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 124: | 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 147: | Line 201: | ||
- | ===== 6. Tipul referinta ===== | + | ===== 7. Tipul referinta ===== |
O declaratie de forma | O declaratie de forma | ||
Line 213: | 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 259: | Line 313: | ||
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. | 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 278: | 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]]. | ||