Documente Academic
Documente Profesional
Documente Cultură
3
Tema: Supraincarcarea operatorilor
O funcie operator are aceleai componente pe care le are orice funcie, include un
nume, un tip returnat, argumente, corp i, eventual, apartenena la o clas.
Exist trei elemente care trebuie stabilite la declararea operatorului, i anume:
este operator unar sau binar,
este postfixat sau prefixat ca poziie
este funcie membru sau nu domeniu de aciune.
Funciile operator membri vor avea cu un argument mai puin dect cele non-
membri.
Putei s suprancrcai numai operatorii existeni. C++ nu v permite definirea
unor operatori proprii.
Definirea operatorilor ca funcii membri a unei clase prezint o restricie
major: primul operand este obligatoriu s fie de tipul clasa respectiv.
n limbajul C++ supradefinirea operatorilor este supus unui set de restricii:
nu este permis introducerea de noi simboluri de operatori;
patru operatori nu pot fi redefinii (vezi mai sus);
caracteristicile operatorilor nu pot fi schimbate:
1. pluralitatea (nu se poate supradefini un operator unar ca
operator binar sau invers),
2. precedena i asociativitatea,
3. prioritatea lor;
funcia operator trebuie sa aib cel puin un parametru de tipul clasa cruia i
este asociat operatorul supradefinit.
Programatorul are libertatea de a alege natura operaiei realizate de un
operator, ns este recomandat ca noua operaie s fie apropiat de semnificaia
iniial.
2. Redefinirea operatorului +
Urmtorul program creeaz o clas Sir i suprancarc operatorul plus (+) astfel
c acesta concateneaz irurile:
#include <iostream.h>
#include <iomanip.h>
#include <string.h>
class Sir // Definirea clasei
{ public:
Sir *operator +(char *sir_adaug); // operator
Sir (char *in_sir) // constructor
{ strcpy(buffer, in_sir);
lungime = strlen(buffer); }
Sir(void) {lungime =0;};
void arata_sir() { cout buffer; };
private:
char buffer[256];
int lungime;
}; // Aici se termina clasa
void main(void)
{
Sir titlu("Autor ");
titlu = titlu + "Titlul carttii\n";
titlu.aratasir();
}
Atunci cnd rulai programul , el va ncepe prin atribuirea membrului buffer irului
Autor". Programul va utiliza apoi operatorul plus suprancrcat pentru a
concatena caracterele Titlul cartii". Observai c operatorul suprancrcat este o
funcie simpl care primete un parametru. Funcia primete numai un singur
parametru. Parametrul este al doilea operand. Operaia nsi implic operandul
instanei.
Operatorul suprancrcat plus utilizeaz funciile strcpy i strcat pentru a copia
irul de caractere dintre ghilimele n obiectul titlu. Observai c acest cod din
cadrul funciei operator plus suprancrcate se refer la datele membre ale
obiectului titlu n mod implicit, cu comenzi cum sunt urmtoarele, care plaseaz
valoarea curent a tidului n obiectul temp:
strcpy (temp.buffer, buffer) ;
Programul ar putea la fel de uor s fac referire la obiect n mod explicit, utiliznd
pointerul this, ca mai jos:
strcpy(temp.buffer, this.buffer);
Din punct de vedere tehnic, parametrul i nu trebuie neaprat s fie de tipul int, dar
deoarece vei defini de obicei matricele cu un parametru ntreg, trebuie s evitai
utilizarea unui parametru de tipul float sau de alt tip. Atunci cnd apelai funcia
operator suprancrcat, C++ va atribui pointerul this la obiect i va folosi
parametrul pentru a controla dimensiunea. Pentru a nelege mai bine prelucrrile
pe care le efectueaz funcia suprancrcat [ ] pentru matrice, analizai urmtorul
program:
#include <iostream.h>
class TipOarecare
{
int a[3];
public:
TipOarecare(int i, int j, int k) // constructor
{
a[0] = i;
a[1] = j;
a[2] = k;
}
int operator[] (int i) {return a[i];}
};
void main(void)
{
TipOarecare ob(l, 2, 3);
cout << ob[l] ;
}
Suprancrcarea operatorului [ ] pentru matrice v ofer posibilitatea de a controla
mai bine crearea matricelor cu clase. Pe lng faptul c v permite s atribuii
valori distincte pentru fiecare membru, putei utiliza funciile suprancrcate pentru
a crea un program care s efectueze o indexare sigur a unei matrice. Indexarea
sigur a unei matrice contribuie 1a prevenirea supradepirii sau subdepirii
limitelor unei matrice n decursul execuiei unu program. Urmtorul program
extinde programul precedent pentru a realiza i indexarea sigur a matricei:
#include <iostream.h>
#include <stdlib.h>
class TipOarecare
{
int a[3];
public:
TipOarecare(int i, int j, int k)
{
a[0]=i;
a[1]=j;
a[2]=k;
}
int &operator[](int i);
};
int &tipoarecare::operator[] (int i)
{ if (i<0 || i>2 )
{
cout <<eroare la margini. \n;
exit (1);
}
return a[i];
}
};
void main (void)
{ TipOarecare ob(l, 2, 3) ;
cout <<ob[l]; cout <<endl;
ob[l] = 25;
cout <<ob[1]; cout <<endl;
ob[3] =44;
}
Atunci cnd ncercai s accesai un obiect de dincolo de marginile matricei, se va
produce o eroare. n cazul programului, ncercarea de a accesa elementul de la
indicele 3 se face dincolo de margini i prin urmare programul va returna o eroare.
Atunci cnd executai programul el va genera urmtorul rezultat:
2
25
Eroare la margini
C:\>
3. S se creeze clasa Date data, care conine cmpurile: ziua, luna, anul. S se
defineasc operatorii "+" i "-" ca metode ale clasei, iar operatorii "++" i "--" n
ambele variante(prefix i postfix) ca funcii prietene. Operatorul "+" trebuie s
permit realizarea operaiilor numai cu variabilele de tip predefinit int (x=y+5). De
prevzut prelucrarea corect a anilor biseci.
4.S se creeze clasa Bool variabile logice. S se defineasc operatorii "+" SAU
logic, "*" I logic, "^" SAU EXCLUSIV, ca metode ale clasei, iar operatorii
"==" i "!=" ca funcii prietene. Operatorii trebuie s permit realizarea
operaiilor att cu variabilele clasei date, ct i cu variabilele de tip predefinit int.
(Dac numrul ntreg este diferit de zero, se consider c variabila este adevr,
altfel fals.)
11. Scriei un program care ar defini clasa de baz string astfel ca ea s afieze la
display simbolurile prin codurile lor interioare. S se efectueze urmtoarele
operaii asupra codurilor:
s se determine spaiul pentru stringul dat,
s se compare dou stringuri,
s se extrag un substring din stringul dat,
s se lichideze un substring din stringul dat din poziia dat,
s se inverseze un string dat.
s se caute un substring din stringul dat.
12. Scriei un program care ar defini clasa mulime astfel ca ea s afieze la display
valorile unei mulimi. S se efectueze urmtoarele operaii asupra mulimii:
s se determine numrul de elemente a mulimii
s se determine spaiul pentru mulimea dat,
s se compare dou mulimi,
s se extrag o submulime din mulimea dat,
s se adauge un nou element la mulime,
s se tearg un element din mulime,
s se caute o submulime din mulimea dat.
Clasa trebuie s fie absolut funcional, adic s conin toi constructorii
necesari i destructorul.