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 prindoua 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 potimplementa prin supraincarcarea corespunzatoare a operatorilor.Pentru inceput se vor defini functiile operator+() sioperator-() 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 nestaticafara 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--()

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 © 2019 - Toate drepturile rezervate

Afaceri


Access
Adobe photoshop
Autocad
Baze de date
C
Calculatoare
Corel draw
Excel
Foxpro
Html
Internet
Java
Linux
Mathcad
Matlab
Outlook
Pascal
Php
Powerpoint
Retele calculatoare
Sql
Windows
Word