Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Satisfactia de a face ce iti place. tutorial, lectii online, solutii simple, exmeple, programe, C++

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
C


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

Multiple instante pentru aceeasi clasa
Mostenirea
Functii prietene
Supraincarcarea operatorilor new si delete
OPERATOR SUPRAINCARCAT
SUBIECTE C++
Supraincarcarea operatorului de apel functie
Destructori
DECLARATII SI CONSTANTE
Constructorul de copiere















 
Copyright © 2019 - Toate drepturile rezervate