From 06728285f9097de27926712dfab15699471c86c0 Mon Sep 17 00:00:00 2001 From: Teodor Date: Wed, 23 Mar 2022 13:09:54 +0200 Subject: [PATCH] init --- POO_22_C_2022-03-10.md | 184 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 POO_22_C_2022-03-10.md diff --git a/POO_22_C_2022-03-10.md b/POO_22_C_2022-03-10.md new file mode 100644 index 0000000..f228a74 --- /dev/null +++ b/POO_22_C_2022-03-10.md @@ -0,0 +1,184 @@ +## FUNCTII INLINE + +O functie inline se implenteaza ca si o functie obisnuita, singura deosebire de implementare fiind data de faptul ca , in fata antetului functiei se pune cuvantul rezervat ```inline```. Spre deosebire de o functie obisnuita, o functie inline are proprietatea ca, apelul ei este inlocuit acolo unde este posibil cu corpul functiei. Din acest punct de vedere, o functie inline se aseamana cu o macrocomanda. Din cauza ca apelul este inlocuit cu corpul functiei obtinem astfel o optimizare din punct de vedere al vitezei de executie, dar, evident, codul obiect (executabil) creste in dimensiuni. + +```cpp +inline int maxim(int x, int y) +{ + return x>y?x:y; +} + +inline int suma (int a, int b) +{ + return a+b; +} + +void main() +{ + int a = suma(1,2)*4; + cout< y``` + +Operatorii new si delete introdusi in C++, in plus fata de C, pot fi supraincarcati. + +La supraincarcare, operatorul isi pastreaza aritatea. Nu putem defini operatori noi. De exemplu ```**``` este un operator din Visual Basic, care nu exista in C++ si in consecinta nu poate fi supraincarcat. + +Supraincarcarea unui operator se face absolut similar cu descrierea unei functii C++, cu observatia ca, supraincarcarea operatorului presupune pentru numele functiei o combinatie intre cuvantul rezervat operator si simbolurile operatorului respectiv. +```cpp +float operator ^(float x, float y) +{ + return pow(x,y); +} +``` + +Supraincarcarea de mai sus este incorecta deoarece cel putin unul dintre operanzi trebuie sa fie de tipul class, struct sau enum. + +Supraincarcarea unui operator poate fi facuta in general intr-unul dintre urmatoarele doua moduri: + +- ca functie externa: numarul de parametri ai supraincarcarii trebuie sa fie egal cu aritatea operatorului. Exceptie de la aceasta regula fac 2 operatori: operatorul de post-incrementare si cel de post-decrementare, care, desi sunt unari au doi parametri. + +- ca functie membra unei clase sau unei structuri: numarul de parametri ai supraincarcarii este egal cu aritatea-1: cei unari nu au parametri, iar cei binari au un singur parametru. Exceptie fac post-incrementarea si post-decrementarea. + +### Supraincarcam operatori pentru urmatoarea structura: +```cpp +#define PI 3.14159 + +struct cerc +{ + float x,y,r; +}; + +float arie (cerc c) +{ + return PI*c.r*c.r; +} + +float operator !(cerc c) +{ + return PI*c.r*c.r; +} + +/* +Se observa ca functia arie si supraincarcarea operatorul ! sunt absolut similare ca si implementare si transmitere de parametri. Deosebirea si plusul adus de folosirea operatorului ! se vede atunci cand acesta este utilizat. +*/ +void main() +{ + cerc c; + cin>>c.x>>c.y>>c.r; + cout<> : pentru extragerea unui cerc din flux de intrate trebuie ca primul paramentru sa fie din clasa istream si valoarea returnata trebuie sa fie referinta catre istream, din aceleasi considerente pe care le-am prezentat in cazul operatorului <<. +```cpp +istream& operator >> (istream& fl, cerc& c) +{ + return fl>>c.x>>c.y>>c.r; +} + +``` +TPA: Supraincarcati pentru cerc operatorii: +- intre 2 cercuri in care rezulta un nou cerc avand x1+x2 y1+y2 r1+r2 +- intre un cerc si un numar real rezulta un nou cerc cu raza micsorata cu real unitati. +```cpp +> +>= +!= +== +~ //(not pe biti): ~c = 2*PI*r *lungimea cercului +``` \ No newline at end of file