Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Doar rabdarea si perseverenta in invatare aduce rezultate bune.stiinta, numere naturale, teoreme, multimi, calcule, ecuatii, sisteme




Biologie Chimie Didactica Fizica Geografie Informatica
Istorie Literatura Matematica Psihologie

C


Index » educatie » » informatica » C
» Functii operator membre ale claselor


Functii operator membre ale claselor


Functii operator membre ale claselor

Forma generala pentru functiile operator membre ale clasei este urmatoarea:

tip_returnat operator#(lista_argumente)

In aceasta forma generala semnul reprezinta oricare dintre operanzii care pot fi supraincarcati.



n           Exemplul 1

Fie o clasa Point care descrie un vector intr-un plan bidimensional prin doua numere de tip double x si y. Valorile x si y reprezinta coordonatele punctului de extremitate al vectorului. Pentru aceasta clasa se pot defini mai multe operatii cu vectori, ca de exemplu:

Suma a doi vectori

Diferenta a doi vectori

Produsul scalar a doi vectori

Multiplicarea unui vector cu o constanta (scalare)

Incrementarea/decrementarea componentelor vectorului

Oglindire (negarea fiecarei componente).

Aceste operatii se pot implementa prin supraincarcarea corespunzatoare a operatorilor. Pentru inceput se vor defini functiile operator+() si operator-() pentru calculul sumei, respectiv a diferentei a doi vectori.

class Point

Point(double a, double b)

void Display()

Point operator+(Point op2); // suma a doi vectori

Point operator-(Point op2); // diferenta a doi vect

double operator*(Point op2);// produs scalar

Point& operator*(double v); // multipl. cu o const.

Point Point::operator+(Point op2)

Point Point::operator-(Point op2)

double Point::operator*(Point op2)

Point& Point::operator*(double v)

void f1()

Functia operator+() are un singur argument, chiar daca ea supraincarca un operator binar (operatorul ), care necesita doi operanzi. Argumentul transmis functiei este operandul din dreapta operatiei, iar operandul din stanga este chiar obiectul pentru care se apeleaza functia operator. Expresia:

pct3 = pct1 + pct2;

semnifica, de fapt:

pct3 = pct1.operator+(pct2);

si chiar poate fi apelata astfel. Acest lucru inseamna ca obiectul din stanga operatorului este cel pentru care se apeleaza functia operator, care are acces la acesta prin pointerul this pasat implicit functiei operator membra a clasei. Pentru functia operator+() ordinea operanzilor nu are importanta, dar aceasta conventie de apel este importanta pentru alte functii, ca de exemplu functia operator

Pentru acelasi operator se pot defini mai multe functii supraincarcate, cu conditia ca selectia uneia dintre ele in functie de numarul si tipul argumentelor sa nu fie ambigua. In clasa Point s-a supraincarcat operatorul cu doua functii: prima pentru calculul produsului scalar a doi vectori, cealalta pentru multiplicarea vectorului cu o constanta. n

In implementarea prezentata, functia operator creaza un obiect temporar, care este distrus dupa returnare. In acest fel, ea nu modifica nici unul dintre operanzi, asa cum nici operatorul pentru tipurile predefinite nu modifica operanzii.

Intr-o functie operator se pot efectua orice fel de operatii, dar, in mod obisnuit, se pastreaza semnificatia actiunii operatorului respectiv. Cu exceptia functiilor operator new operator delete() si operator->(), valoarea returnata de o functie operator poate fi de orice tip, dar, tot pentru pastrarea contextului utilizarii normale, de obicei se returneaza un obiect din aceeasi clasa, sau o referinta la aceasta. Acest lucru este important pentru utilizarea operatorului in expresii, asa cum este cea scrisa mai sus.

In expresia scrisa mai sus, pct3 = pct1 + pct2, se executa, pe langa operatia de adunare, si o operatie de asignare pentru o variabila de tip Point. Pentru clasa Point, aceasta operatie se executa corect, chiar daca nu a fost supraincarcata functia operator deoarece asignarea implicita se executa printr-o copiere membru cu membru si in acest caz nu produce erori. Conditiile in care este absolut necesara supraincarcarea functiei operator=() vor fi discutate in subsectiunea urmatoare.

In general, un operator binar poate fi supraincarcat fie printr-o functie membra nestatica cu un argument, fie printr-o functie nemembra cu doua argumente.

Un operator unar poate fi supraincarcat fie printr-o functie membra nestatica fara nici un argument, fie printr-o functie nemembra cu un argument. La supraincarcarea operatorilor de incrementare sau decrementare ( ) se poate diferentia un operator prefix de un operator postfix folosind doua versiuni ale functiei operator. In continuare sunt prezentate cateva functii operator ale clasei Point pentru operatori unari.

class Point

Point operator!()

Point Point::operator++()

Point Point::operator--()

Point Point::operator ++(int x)

Point Point::operator --(int x)

Daca precede operandul, este apelata functia operator ; daca urmeaza operandului, atunci este apelata functia operator++(int x), iar x are valoarea 0.






Politica de confidentialitate




Copyright © 2024 - Toate drepturile rezervate