You are on page 1of 9
Laborator 6 - POO Membri statici Principala utilizare a variabilelor membru statice const in eliminarea in cat mai mare masura a variabilelor globale utilizate intr-un program. Cuvantul cheie “static” poate fi utilizat in prefixarea membrilor unei clase. Odat’ declarant “static”, membrul in cauza are proprietati diferite, datorita faptului ci membr unui anumit object, ci sunt comuni tuturor instantierilor unei clase. Pentru o variabilé membru static’ se rezervi o singura zon’ de memorie, care este comun’ tuturor instantierilor unei clase (obiectelor). Variabilele membru statice pot fi prefixate doar de numele clasei, urmat de operatorul de de rezolutie “::”. Apelul metodelor statice se face exact ca si accesarea variabilelor membru statice. Deoarece metodele statice nu sunt apelate de un obiect anume, nu lise transmite pointerul ascuns “this”. Dac’ intr-o metodd staticd se folosesc variabile membru nestatice, e nevoie s& se furnizeze un parametru explicit de genul obiect, pointer la obiect sau referinté 1a obiect. Toti membrii staticl sunt doar declarati in cadrul clasei, ei urmand a fi obligatoriu initializati. Exemplu clase exenplu ( int 47 publ static int contor; // variabila membru =i static inc (void) {i++s} // metoda statica vold inc contor {void} {contor++;} void init (void) {i = Or} static void functie (exemplu *); // metoda stat } obl, ob2, ob37 int exempluzrcontor ~ 0; // initislizares yariabilei stat: vold exenplu::functie(exemplu *ptrEz) { Mite 6 It // apartine i ptrix > its; // correct contor +7 // corect } void main(void) { obl-init (1; ob3.init(); ob1.inc(}z ob2-ine(); ob3-inc(}; obl.functis{eobl); // corect exemplu zt functie(éob2); // corect // functie(); // incorect - in afara cazului in // exista o metoda ne-membru cu acest nume Ane_contor(}7 exemplu i: contort } Functif friend O functie friend este o functie care nu e membru a unei clase, dar are acces la membrii de tip private si protected ai clasei respective. Orice functie poate fi friend unet clase, indiferent daca este 0 functie obignuitd sau este membru al unei alte clase. Exemplu: class exemplu { int az int £ (void); friend int fl(exemplu &); public: friend int M: £2lexemplu @, int); int fl(exemplu ex) { return ex.f (3 t int Mit £2(exemplu eex, int 4 ( if (ex.a > 7) retuen j++; else return j--7 1 Dupa cum se observa, nu conteaza dacé o functie este declarata friend in cadrul sectiuni private sau public a unei clase. Clase friend Daca se doreste ca toti membrii unei clase “M” si aiba acces la partea privat a unei clase “B”, in loc s8 se atribuie toate metodele lui “M” ca fiind friend ai lui “B”, se poate declara clasa “M” ca si clasé friend lui “B". Exemplu: class M { TL sve lass B 8 { PP cave friend class Ms te Relatia de friend nu este tranzitiva, adicd dacd clasa A este friend clasei 8, iar clasa B este friend clasei C, aceasta nu implicé faptul cd, clasa A este implicit friend clasei C. Functillor friend nu li se transmite parametrul ascuns this. Aceast carenta este suplinita prin transmiterea unor parametrii obignuiti de tip pointer, obiect sau referintd la obiect. Exemplu: class rational; // declarare incompleta class complex P double p_reala, p_imaginara; friend complex& ponderare (complex&, rationals); {double r, double i} : p_reala (r), p_imaginara (4) double get_real (void) (return p_realas} double get_imaginar (void) [return p_imaginara;} ea class rational { int numarator, numitors double val; public: friend complex& ponderare (complexs , rationals): rational (int nl, int n2) : mumarator [n1} t numitor = n2t=0 2 2:1 val = ((double)numarator} /numitor t double get_valoare(void) { return val; he // fiind "friend", functia ponderare are acces la membrii privati ai // claselor "complex" si "rational" complex sponderare(complexé c, rationals r) t complex *t = new complex (c.p_reala *r.val, c.p_imaginara ve.val)i return *t; } // nefiind "friend", "ponderare ineficienta" nu are acces la membrd 1 // privati ai claselor “complex” si "rational" complex §ponderare ineficienta (complex &c, rational sr { complex *t = new complex (c.get_real[)*r.get_valoare(| e.get_imaginar()*r.get_valoare(}} return ‘te 1 void main{void} { complex a(2,4),b(6,9)2 rational d(1,2),e(1)3)¢ a = ponderare(a,d)z b = ponderare(b,e): a = ponderare ineficienta(a,d}; b = ponderare _ineficienta(b,e}; 1 Problema 1 Sa se implementeze clasa Complex si doua functii friend pentru adunarea, respectiv inmultirea a doua numere complexe. #include #include class Complex { private: float real,imaginar; public: Complex (float £,float im); void afisare(); friend Complex adunare (Complex a,Complex b)+ friend Complex inmultire(Complex a,Complex b)# te Complex: { real=r; imaginar=imy } void comple: { if (imaginar<-0) cout< #include class Complex { private: float real,imaginar; public: Complex(float r,float im} void afisare(); friend Complex adunare(Complex a,Complex b)i friend Complex inmultire(Complex a,Complex b); friend float lungime(Complex a,Complex b)s friend aria(Complex a,Complex b, Complex c); le Complex { real=ti imaginar=imy t void Comple: { if (imaginar>=0) cout< class persoana { static int total_pers; static int total_b; char sex; public: persoana{char sx Constructor de clasa";} ~persoana() {total_pers--;cout<<"\n Destructor de clasa’ static int spune _total() {return total_pers static int spune_total_b() {return total_b, static void numara_b(persoana *pp) {if (pp->sex=="B') total_b++:} B') (total_pers++;se: 7 COURSE” \n } [101s int persoana::total_per: int persoana::total_b=0; void main() f plO0]=persoana('F'); p[Sl=persoanal*P')+ cout<<"\n In cele "< finclude define dim 20 using namespace st ass Sstiva int s{din] ; int vf; //varful stivei public: Sstiva(); ~Sstiva()+ void Push(int e); //introduce elementul e in stiva int Pop(}; //extrage un element din stiva. Se aplica tehnica LIF int Lungime() //returneaza marimea stivei { return vty } int Blem[int index); //returneaza elementul de pe un anumit index void Afisare()7 Sstiva(void) cout<<"Stiva initializata."<>es if(e) iffe q “an ob. Push (e) 7 ob. Afisare()? cout<<"Dimensiunea stived est "cob. Lungime(}<>g7

You might also like