C
Folosirea cuvantului cheie this, supraincarcarea operatorilor, functii cu parametri impliciti, functii prietene, clase prietene1. Folosirea cuvantului cheie this Cuvintul cheie this reprezinta o variabila locala predefinita a oricarei metode nestatice a unui obiect, variabila ce nu trebuie declarata si care este rareori folosita in corpul functiei. Aceasta variabila este de tip pointer la o variabila de tipul obiectului curent si contine adresa obiectului prin care a fost apelata functia. Situatia se prezinta ca si cum metodei i s-ar transmite implicit n this adresa instantierii prin care a fost apelata. Cind se face apelul metodei x.func() this este setat la &x si poate fi folosit in corpul functiei: class X 2. Supraincarcarea operatorilor Limbajul C++ permite ca actiunea operatorilor sa fie redefinita pentru noi tipuri de date. Aceasta supraincarcare a operatorilor se face prin definirea unor functii speciale (functii ce pot fi sau nu metode ale unui obiect). class X int geta( ) ; int getb() ; X operator +(X& x) ; int operator !(X *px) main() Daca functia de supraincarcare este membra a unui obiect, atunci ea primeste in mod implicit ca prim parametru obiectul prin intermediul caruia este apelata. Din aceasta cauza in lista de argumente a functiei operator + din exemplul de mai sus nu este specificat decat un singur argument. Un operator special este cel de atribuire (=), care se apeleaza ori de cate ori se intalneste o expresie de tipul a = b sub forma a.operator=(b). Pentru exemplul de mai
sus modul de definire al acestui operator este prezentat mai jos. Acest operator returneaza o referinta la X pentru a permite atribuiri multiple (a = b = c = d). Explicati de ce o valoare de retur referinta permite acest lucru! X& operator = (X& x) 3. Functii cu parametri impliciti In C++ ultimii parametri ai oricarei functii (membra a unui obiect sau functie ordinara) pot avea valori implicite. In cazul folosirii acestei facilitati, la apelul functiei pot lipsi toti parametrii declarati cu valori implicite sau ultimii dintre ei. int f(int x, int z = 9, float r = 5, char c = 'Y') char g(int p=2, char t); // EROARE! main() Aceasta facilitate este foarte utila la definirea constructorilor precum si in cazul unei functii deja definite si apelate in numeroase puncte ale programului, dar a carei functionare trebuie modificata pentru a fi utilizata si in alt context. Pentru aceasta, se adauga la argumentele existente ale functiei un flag care pentru valoarea implicita va conduce la executia vechiului corp al functiei, iar pentru alta/alte valori va conduce la executia functiei modificate. Astfel, apelurile vechi situate in diferite puncte ale aplicatiei nu mai trebuie gasite si modificate. 4. Functii prietene. Clase prietene Limbajul C++ permite accesul la membrii cu mod de acces private si protected ai unui obiect si din exteriorul metodelor proprii prin declararea de functii si clase prietene folosind cuvntul cheie friend. class Point friend void f(void); // functie prietena friend class X; // clasa prietena void f() class X // acces la membru privat Folosirea functiilor prietene in asociere cu operatorii supraincarcati poate ridica probleme de ambiguitate, deoarece un operator poate fi definit ca atat ca metoda cat si ca functie nemembru (eventual prietena). class X X operator+(X& x, double d) void g(X b) Daca s-ar fi introdus si X operator+(X& x, int n) toate atribuirile ar fi fost ambigue! 5. Aplicatii 5.1. Implementati o clasa Complex care sa incapsuleze lucrul cu numere complexe. Supraincarcati operatorii +,-,=,= =,! (va returna modulul numarului complex), ~(va realiza afisarea numarului complex) 52. Implementati o clasa String care sa faciliteze lucrul cu siruri de caractere. Operatori: +, =,= =, ~ (schimba majusculele in minuscule si invers) Metode: Find (realizazea cautarea unui caracter/subsir intr-un sir), Print (afiseaza sirul), Compare(compara un sir cu un alt sir) Constructori: vid, cu argumente (un sir de caractere), de copiere
|