Sunteți pe pagina 1din 5

RO: Funcii i clase prietene. Membri statici. EN: Friend functions and classes. Static members.

Obiective: Capacitatea de a utiliza funcii i clase prietene (friend) i membri statici (variabile i metode) ai unei clase; nelegerea practic a acestor noiuni prin implementarea de programe. Rezumat: Funcia prieten (friend) este o funcie care poate accesa oricare atribut al unei clase, inclusiv cele private, din afara acelei clase prin intermediul unui obiect. Existena lor se justific deoarece n unele situaii scutesc programatorul de munca derivrii i adugarii unei noi funcionaliti. Funcia friend poate fi la rndul ei membr a altei clase. O clas prieten (friend) este o clas care are acces la toti membrii unei alte clase. Funcionalitatea specificatorului static se refer la existena unei singure copii a unui membru, n cazul n care exist mai multe obiecte din clasa respectiv. O particularitate n cazul folosirii variabilelor statice este necesitatea redeclarrii lor n exteriorul clasei. Metodele statice au o serie de caracteristici restrictive: - au acces doar la alti membri de tip static ai clasei i bineneles, pot lucra cu membrii globali ; - nu pot avea pointeri this; - nu pot exista dou versiuni ale aceleiai metode, una static i una ne-static. Exemple: //Exemplul 1- functii friend #include <stdio.h> #include <iostream> using namespace std; class myClass{ private: int m, n; public: friend float media(myClass); void init(int x, int y){ m = x; n = y; } }; float media(myClass x){ float rez; rez = (float)(x.m + x.n)/2.; return rez; } void main(void){ myClass ob1; int x, y; cout << "\nValoarea lui x: "; cin >> x; cout << "\nValoarea lui y: "; cin >> y; ob1.init(x, y); cout << "\nMedia aritmetica a celor doua numere este: " << media(ob1); } //***************************************************************************** //Exemplul 2 operatorul de adunare pentru numere complexe cu functii prieten #include <iostream> using namespace std; class Complex // implementarea functiei friend

{ private: double r,i; public: Complex () { r = 0; i = 0; }; void set_values(double re, double im) { r = re; i = im; } double get_real() { return r; } double get_imaginar() { return i; } friend Complex operator_plus(Complex, Complex); }; Complex operator_plus(Complex j, Complex k) { Complex l; l.r = k.r + j.r; l.i = k.i + j.i; return l; } void main (void) { Complex a,b,c; a.set_values(10, 20); b.set_values(20, 30); c = operator_plus(a, b); cout<<"Suma este: "<<c.get_real()<<"+i*"<<c.get_imaginar()<<endl; } }//***************************************************************************** //Exemplul 3 - variabile statice #include <iostream> using namespace std; class myClass{ private: int x; static int y; public: void init_values(int a, int b){ x = a; y = b; } void show_values(){ cout << "\nValoarea lui x(nonstatic): " << x;

cout << "\nValoarea lui y(static): " << y; } };

int myClass::y; //variabila statica va fi astfel vizibila si initializata cu 0 void main(void){ myClass ob1, ob2; ob1.init_values(1, 2); ob1.show_values(); ob2.init_values(5, 6); ob2.show_values(); ob1.show_values(); } //************************************************************************************* //Exemplul 4 - metoda statica v_calend actioneaza asupra atributelor statice zz,ll,aa din clasa Dc #include <stdio.h> #include <conio.h> class Dc { int zi,luna,an; static int zz,ll,aa; public: Dc(int z=25, int l=4, int a=2000) { zi=z; luna=l; an=a; } static int v_calend(Dc *d); };//Dc int Dc::zz, Dc::ll, Dc::aa; int Dc::v_calend(Dc *d) { static int t_nrz[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int z,l,a; if (d->an<1600 || d->an>4900) return 0; if (d->luna<1 || d->luna>12) return 0; if (d->zi<1 || d->zi>t_nrz[d->luna]+(d->luna==2&& (d->an%4==0 && d->an%100 ||d->an%400==0))) return 0; z=Dc::zz=d->zi; l=Dc::ll=d->luna; a=Dc::aa=d->an; //... if (a<1600 || a>4900) return 0; if (l<1 || l>12) return 0; if (z<1 || z>t_nrz[l]+(l==2&&( a%4==0 && a%100 ||a%400==0))) return 0; return 1; }//v_calend void main() { int z,l,a; printf("\n Dati ziua="); scanf("%d",&z); printf("\n Dati luna="); scanf("%d",&l); printf("\n Dati anul="); scanf("%d",&a);

Dc data_calend(z,l,a); if (Dc::v_calend(&data_calend)==0) puts("\n Data erronata"); else printf("\n Data este corecta"); getch(); }//***************************************************************************** //Exemplul 5 - clasa Obiect in care se defineste variabila contor var_static de tip static intreg #include <stdio.h> class Obiect { int valoare; static int var_static; public: Obiect(int v) { valoare = v; var_static++; } int valoare() { return valoare; } static int valoare_var_static() { return var_static; } }; Teme: 1. Construii o aplicaie n care clasa OraCurenta are ca variabile private ora, minutele i secundele i metode publice de citire i afisare a orei. Adaugai o functie friend clasei prin care s se poat copia coninutul unui obiect OraCurenta ntr-un alt obiect instan a aceleiai clase. 2. Scriei o aplicaie C/C++ n care clasa Calculator are un atribut privat memorie_RAM (int) i o funcie prieten tehnician_service care permite modificarea valorii acestui atribut. Functia friend va fi membra intr-o alta clasa, Placa_de_baza care are o component denumire_procesor (sir de caractere). Scriei codul necesar care permite funciei prietene tehnician_service s modifice (schimbe) valoarea variabilei denumire_procesor si memorie _RAM. 3. Defini o clas numit Repository care are dou variabile private de tip ntreg. Clasa mai conine un constructor explicit vid si unul cu 2 parametri i o metod accesor care afieaz valorile variabilelor din clas. Scriei o clas numit Mathemathics, friend cu prima clas, care implementeaz operaiile aritmetice elementare (+, -, *, /) asupra variabilelor din prima clasa. Fiecare metoda primete ca parametru un obiect al clasei Repository. 4. Scriei o aplicaie C/C++ care definete ntr-o clas variabila public contor var_static de tip static ntreg. Aceasta se va incrementa n cadrul constructorului. Dup o serie de instanieri, s se afieze numarul de obiecte create (coninutul variabilei var_static). 5. Rezolvai problema 4 n cazul n care variabila static este de tip privat. Definii o metod accesor care returneaz valoarea contorului. 6. Scriei o aplicaie C/C++ n care s implementai clasa Punct cu atributele private x si y. Implementai dou funcii friend care s calculeze aria i perimetrul definit de dou puncte, considernd c acestea definesc colul stnga sus (x0,y0) i colul dreapta jos (x1, y1) al unui dreptunghi. Adugai funciilor un parametru ntreg figura prin care s indicai figuri geometrice ce sunt definite de punctele (x0,y0) si (x1, y1). Astfel, pentru un cerc, figura=2, coordonatele (x0,y0) i (x1, y1) vor reprezenta dou puncte complementare pe cerc (diametrul). Dac este triunghi dreptunghic, punctele definesc ipotenuza. 7. La un chioc se vnd ziare, reviste i cari. Fiecare publicaie are un nume, o editur, un numr de pagini, un numr de exemplare per publicaie i un pre fr TVA. Scriei clasa care modeleaz publicaiile. Adugai un membru static valoare_tva (procent) i o metod static pentru modificarea valorii TVA-ului. S se calculeze suma total cu TVA pe fiecare tip de publicaie (ziare, reviste i cari) i pre ul mediu pe pagina la fiecare publicaie n parte. Modificai TVA-ul i refacei calculele. Afiai editurile ordonate n funcie de ncasri.

Homework: 1. Implement a C++ application that defines the class called CurrentHour with hour, minute, second as private members. The class has 2 public methods that initialize and display the current hour. Add a friend function that copies the content of a CurrentHour object into another instance of the class. 2. Write a C++ application in which the class Calculator has a private attribute called RAM_memory (int) and a friend function named service_technician that can modify the attributes value. The friend function will be member in the class Motherboard, that encapsulates the processor_type variable (string of

3.

4.

5. 6.

7.

characters). Write the code that allows the modifying of the processor_types value and the RAM_memory from the friend function. Define a class called Repository that has 2 integer private variables. The class contains an empty constructor and another one with 2 parameters. An accesor method that displays the variables values is also included in the class. Write another class called Mathematics which is friend to the first one. This class contains the implementation of the elementary arithmetical operations (+, -, *, /) applied to the values stored in the first class. Each arithmetical method receives as parameter an object instantiated from the first class. Write a C++ application that stores inside a class a public static integer variable called var_static. The variable is incremented each time the classs constructor is called. After instantiating several objects, display their number using the value of the static variable. Implement the 4-th problem by changing the static variables access modifier to private. Define a method that returns the counters value. Write a C++ application that defines a class named Point with the private attributes x and y. Implement 2 friend functions that calculate the area and perimeter of the rectangle that has as top left corner point (x0, y0) and (x1, y1) as bottom right corner. Introduce another parameter named shape that controls the manner in which the two points are used. If we consider a circle, the points d elimit the circles diameter. If we are dealing with a right triangle, the points determine the hypotenuse. A kiosk sells newspapers, magazines and books. Each publication has a name, an editorial house, a number of pages, the number of copies and a price. Write the class that models the publications. Introduce a static member named VAT_value (percentage) and a static method that modifies the value of this variable. Determine the total income and the average price per page for each publication type. Modify the VAT and redo the calculations. Order the printing houses by the total income and display the result.

S-ar putea să vă placă și