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
» Supraincarcarea operatorului pointer


Supraincarcarea operatorului pointer


Supraincarcarea operatorului pointer

Operatorul pointer -> poate fi considerat un operator unar postfix, care se aplica operandului care il precede. Supraincarcarea acestui operator se poate face printr-o functie nestatica membra a clasei, cu acceasi sintaxa ca cea prezentata la inceputul acestei sectiuni. Fie o operatie de selectie membru cu forma generala

obiect->expresie



unde obiect este o instanta a unei clase oarecare X pentru care s-a supraincarcat operatorul pointer. Evaluarea pentru expresie se executa in functie de tipul de data returnat de functia supraincarcata a clasei X operator ->()astfel:

a)      Daca    functia operator->() a unei clase X returneaza un obiect de tipul X, atunci se acceseaza elementul corespunzator (obtinut prin evaluarea expresie) a clasei X

b)      Daca functia operator->() a unei clase Y returneaza un pointer la o data de un tip oarecare, atunci se aplica operatorul -> predefinit, adica se selecteaza o componenta a obiectului catre care indica pointerul returnat.

n           Exemplul 6

Fie doua clase X si Y in care se supraincarca in mod deosebit operatorul de pointer: in clasa X functia operator->() returneaza un pointer la tipul X, iar in clasa Y functia operator->()returneaza un pointer la tipul X (deci diferit de tipul Y al clasei respective).

class X

void Display()

friend ifstream& operator>>(ifstream& stream,

X& obX);

ifstream& operator>>(ifstream& stream, X& obX)

X* read_from_disk(const char *p)

class Y

X* operator->()

void f7()

In acest exemplu implementarea functiei read_from_disk() folosind operatii cu streamuri este mai putin interesanta (ea poate fi inteleasa mai bine dupa prcurgerea operatiilor cu streamuri), ccea ce intereseaza este faptul ca returneaza un pointer la un obiect de tipul X, obiect creat in memoria heap si    initializat prin citirea unor date dintr-un fisier de pe disc.

Din acest exemplu se pot observa cele doua modalitati de utilizare a functiei operator->() supraincarcate in cele doua clase X si Y

Functia operator->() din clasa X returneaza un pointer la X (chiar pointerul this), de aceea poate fi utilizata pentru a accesa o data membra a clasei X. De aceea, operatiile obX->x si obX.x sunt echivalente si mesajele afisate la consola sunt identice, indicand valoarea datei membre x a obiectului obX de tip X

Functia operator->() din clasa Y returneaza un pointer la X, de aceea poate fi utilizata pentru accesul la o data membra a clasei X, si anume functia Display(). La constructia obiectului obY, sunt initializate datele membre name = "test.txt" si pX . Apelul functiei operator de dereferentiere pentru obiectul obY din clasa Y apeleaza functia read_from_disk() care creaza un obiect de clasa X in memoria heap, il initializeaza cu date citite din fisierul cu numele "test.txt" returneaza pointerul la acest obiect creat. Acest pointer este folosit pentru selectarea functiei Display( a obiectului. La consola se afiseaza valoarea numarului intreg citit din fisierul al carui nume este transferat ca argument constructorului obiectului obY test.txt

n

Supraincarcarea operatorului pointer este o trasatura puternica a limbajului C++, care permite construirea de programe interesante si flexibile.






Politica de confidentialitate




Copyright © 2024 - Toate drepturile rezervate