Supraîncărcare funcţii şi operatori

Slides:



Advertisements
Prezentări similare
Curtea Supremă a Republicii Croația
Advertisements

Estimarea Cheltuielilor
Acesta este un prototip de automat de bilete/abonamente RATUC , derulati-l pe slide show si dati click pe butoane (nu pe toate butoanele)  START.
Pentru copii si parinti
ELECTRONICĂ II Notiţe de curs Cursul nr. 8
Relatii intre radacini si coeficienti (relatiile lui Viète)
Bazele Tehnologiei Informaţiei Curs 7
Algoritmii Dijkstra si Bellman-Ford pentru determinarea costului minim
Care sunt aceste numere?
Adunarea numerelor naturale
Determinarea divizorilor unui numar
CONDUCĂTORI AUTO PROFESIONIŞTI
Recapitulare – rezolvați următorul rebus:
Sisteme de calcul în timp real
Tehnici de machetare ecran (tpz; atribMarci;)
Convenția de la viena articole.
Review: Broker In contextul aplicatiilor distribuite (bazate pe interactiuni de tip client-server), se doreste: Separation of concerns: logica aplicatiei.
TEORIA SISTEMELOR AUTOMATE
TEORIA SISTEMELOR AUTOMATE
Structura sistemelor de calcul (03-5)
Ethernet.
Procesarea și optimizarea interogărilor
Facultatea de Informatică Universitatea “Al. I
.NET Framework Limbajul C#.
PENTRU MEMBRII ASOCIAȚIEI „MOLDOVA APĂ-CANAL”
MEDIUL LIMBAJULUI DE PROGRAMARE STUDIAT
BANII, FRAUDA ŞI POLITICIANUL
completări şi modificări aferente drepturilor acţionarilor:
TOATE drepturile fundamentale pentru TOATE persoanele cu dizabilităţi!
PENTRU MEMBRII ASOCIAȚIEI „MOLDOVA APĂ-CANAL”
1 CIRCUITE NUMERICE III.2.3 Numărătoare sincrone
Sisteme Încorporate Curs 2.
Profilul pieţei bancare din mediul urban românesc
7 aprilie 2019 Ziua Mondială a Sănătăţii
TIMPUL, FORȚA SUPREMĂ A EXISTENȚEI
Distribuit de.
Activitatea Serviciului Informatizare-Comunicaţii în anul 2005
Metodologia elaborării proiectelor de intervenţie
Testul docimologic Conf. dr. Florin Frumos
Generalități despre fișiere
SORTAREA PRIN METODA BULELOR
2. Unitatea aritmetică și logică
PARTEA I UTILITARE DE SISTEM
S t r u c t u r i l i n i a r e  .
Optimizarea funcțiilor de pierdere. Algoritmul coborârii pe gradient.
Riscuri operationale - definitie
ALGORITMI PENTRU SORTAREA UNUI VECTOR
Informatica in economie
Tinerii: bine informați, stăpâni pe situație!
TDA şir Structuri de date şi algoritmi -laborator-
5. Introducere în arhitecturi paralele
CONFERINTA in parteneriat cu SECTRA si
concepte si instrumente de lucru e-Learning si software educational
TINERII INTRE “DA” SI “NU”
Companii Sănătoase, cu angajați Sănătoși
Curs 10-Operatii cu pointeri -Pointeri la tablouri
Monitorizarea modului de creştere şi îngrijire a copilului cu părinţi plecaţi la muncă în străinătate.
ESANTIONAREA SI CUANTIZAREA IMAGINILOR 1. Introducere
Sisteme de operare în timp real Contiki
Curs 9-Pointeri la variabile -Pointeri la siruri de caractere
ADJECTIVUL.
Structura sistemelor de calcul (02-3)
Geometrie clasa a VII-a
Susţinerea reformării Sistemului Instituţiilor Penitenciare şi a Reformei Penale în Republica Moldova (2011)
TATUAJUL şi RISCURILE LUI
Instrumentar de formare privind APE 7.9. Transportul rutier
Proiect Tehnologia informatiei si comunicarii
Transcriere de prezentare:

Supraîncărcare funcţii şi operatori Polimorfism – același nume ascunde transformări diferite: int suma( int i1, int i2) ; // suma de intregi double** suma(double **m1, double ** m2, int m, int n); // suma de matrici double suma(Pers &p1, Pers &p2); // suma de persoane => cumul salarii Overloading (static) – rezolvat din compilare, prin completari la numele funcțiilor Overriding (dinamic) – rezolvat prin vector (tabela) de pointeri la funcții; pointerii se incarcă la momentul execuției   Overloading treaba compilatorului; cum? decorare nume; chiar când avem o sg funcţie, deoarece nu stim daca la linkeditare nu apar altele care se numesc la fel ! nu se pot folosi compilatoare diferite pentru aceeasi familie de functii

Supraîncărcare funcţii şi operatori Conflict: conversii de adaptare la prototip  posibilitatea supraîncărcării! Solutie automată: etapizarea identificării funcției de apelat. identificarea conform prototipului funcţiei (fără conversii); dacă nu există, se aplică conversii nedegradante (fără pierderi de informaţii): char, short, int, respectiv float, double; se continuă cu operarea conversiilor degradante (cu pierderi de informaţii): de la numeric la numeric, indiferent de tip; între pointeri de orice tip şi void; de la o constantă întreagă către pointer sau de la pointer de clasă derivată la pointer de clasă de bază; într-o ultimă etapă, procesul de identificare a funcţiei de apelat continuă prin aplicarea eventualelor conversii introduse de utilizator, prin supraîncărcarea operatorului cast.   căutarea se opreşte când o singură funcţie corespunde criteriilor de selecţie; dacă după conversii, corespund mai multe funcţii => eroare de ambiguitate. nicio versiune selectata pana la sfarsit => eroare la linkeditare (simbol nedefinit).

Supraîncărcare operator++ Pre / post fixare in raport de: alt operator: x[++i]=10; v = --i; // momentul atribuirii o instructiune: while (i--) { …. } // momentul testului un apel de functie: f(++i); // momentul punerii pe stiva Observatie: inclusiv apel de constructor pentru initializare: Pers() : marca(++nrPers) { } supraincarcare prin functie independenta: operator++(p1) echivalent cu ++p1; // forma prefixata dar pentru postfixare ? in forma prescurtata: p1++; operator++(p1, 1) supraincarcare prin functie membra: p1.operator++(); echivalent cu ++p1; p1.operator++(1); echivalent cu p1++;

Supraîncărcare operator++ prin functie independenta class Pers { public: int varsta; Pers(int v = 0) :varsta(v) { } friend const Pers & operator++(Pers &a) // prefixat { a.varsta++; return a; } friend const Pers operator++(Pers &a, int) // postfixat Pers aux = a; // conservarea starii initiale a.varsta++; return aux; // return prin valoare } }; void main() Pers p1(25), p2; p2 = ++p1; cout << p2.varsta << " "; // 26 p2 = p1++; cout << p2.varsta << " "; // 26 cout << p1.varsta; // 27 getchar();

Supraîncărcare operator++ prin functie membra class Pers { public: int varsta; Pers(int v = 0) :varsta(v) { } const Pers & operator++() // prefixat { varsta++;return *this;} const Pers operator++(int) // postfixat Pers aux = *this; // conservarea starii initiale varsta++; return aux; } }; void main() Pers p1(25), p2; p2 = ++p1; cout << p2.varsta << " "; // 26 p2 = p1++; cout << p2.varsta << " "; // 26 cout << p1.varsta; // 27 p1.operator++(1); p1.operator++(); getchar();

Supraîncărcare operator++ De ce la postfixat returneaza valoare ? Daca ar returna referinta (sau pointer) ar trebui ca aux sa rămâna alocat! static Pers aux = p; // initializare de static! O singura data! static Pers aux; aux = p; // atribuire Probleme: ce ar insemna p++++ ? pe cine incrementeaza a doua oara ? referinta intoarsa de primul apel este a lui aux (obiect neincrementat) lucru cu fire de executie ? Cine a scris ultima data in aux ? Pers & aux = *new Pers(); alocă la fiecare intrare in functie! cine dezalocă ?