Documente Academic
Documente Profesional
Documente Cultură
EXEMPLE:
EXEMPLUL 1:
Trecerea de la o funcŃie membră obişnuită la un operator supraîncărcat. Un operator
supraîncărcat poate fi definit ca şi o funcŃie membră specială a unei clase.
class matrice
{
//…
public:
matrice AdunMatrice(matrice&);
matrice operator + (matrice&);
//…
};
//...
// Diferenta dintre cele doua metode este comoditatea apelului
// in cazul celei de a doua:
//...
matrice a, b, c;
//...
c=a.AdunMatrice(b); //corect, dar incomod
c=a.operator+(b); //corect, dar incomod
c=a+b; //prin supraincarcare, mult mai comod si mai natural
//...
EXEMPLUL 2:
Supraîncărcarea unui operator prin funcŃii membre (adunarea a doi vectori cu originea în
punctul (0,0) şi vârful în punctul de coordonate date).
class vector
{
double x, y;
public:
vector operator + (vector);
};
1
void main()
{ vector A(1.1, 2.2); A.afisare();
vector B(-5.5, -6.6); B.afisare();
vector C;
C=A+B; C.afisare();
C=A+B+C; C.afisare();
}
EXEMPLUL 3:
Supraîncărcarea unui operator prin funcŃii prietene (adunarea a doi vectori cu originea în
punctul (0,0) şi vârful în punctul de coordonate date).
void main()
{ vector A(1.1, 2.2); A.afisare();
vector B(-5.5, -6.6); B.afisare();
vector C;
C=A+B; C.afisare();
C=A+B+C; C.afisare();
}
EXEMPLUL 4:
Supraîncărcarea prefixată şi postfixată a operatorului unar de incrementare ++. Se observă că
numărul de parametri, în cazul unui operator unar, este mai mic cu unu decât în cazul
operatorilor binari. Operatorul de incrementare postfixată are un parametru în plus faŃă de
forma prefixată, pentru a permite compilatorul să facă deosebirea între cei doi operatori.
2
void main()
{ vector A(11, 10); vector C=A++; A.afisare( ); C.afisare( );
vector C=++A; A.afisare( ); C.afisare( );
}
EXEMPLUL 5:
Supraîncărcarea operatorilor insertor << şi extractor >>. Deoarece întotdeauna operandul
stâng este de tip istream (cin este obiect predefinit, de tip istream) sau ostream (cout este
obiect predefinit, de tip ostream), şi nu de tipul introdus prin clasă, operatorii << şi >> pot fi
supraîncărcaŃi numai prin funcŃii prietene. Modificatorul const previne modificarea
operandului drept în cazul afişării.
EXEMPLUL 6:
Supraîncărcarea operatorului de atribuire =. În cazul în care operatorul de atribuire = nu este
supraîncărcat explicit, compilatorul generează implicit unul, care va fi binar, cu ambii
operanzi de acelasi tip şi va copia valorile datelor membre ale operandului drept în datele
membre ale operandului stâng. Operatorul de atribuire implicit este nesatisfăcător în situaŃiile
în care obiectele clasei au ca date membre pointeri, sau în situaŃiile în care memoria este
alocată în mod dinamic.
void main()
{ complex a, b;
a = b; // a.operator=(b);
}
3
b. prin funcŃie prietenă
class complex
{ double re,im;
public:
friend complex &operator=(complex&,const complex&);
//functie prietena constanta
};
void main()
{ complex a, b;
a = b; //a.operator=(b);
}
PROBLEME PROPUSE:
2. ModificaŃi programul de la problema 1 de mai sus, astfel încât să se poată realiza citirea şi
afişarea vectorilor, prin supraîncărcarea operatorilor insertor << şi extractor >>, folosind
exemplul 5.
4. ModificaŃi acelaşi program de mai sus, adăugând o funcŃie membru având prototipul float
operator*(vector) ce va da posibilitatea definirii produsului scalar, deci o supraîncărcare
pentru înmulŃire *, după modelul următor:
5. ModificaŃi acelaşi program de mai sus, adăugând o funcŃie membru având prototipul float
operator*(float) ce va da posibilitatea definirii produsului dintre un număr real şi un vector,
după modelul următor:
Ce se va întâmpla dacă dorim să realizăm operaŃia următoare? v2=h*v1; Cum putem rezolva
această problemă?