Prezentarea se încărcă. Vă rugăm să așteptați

Prezentarea se încărcă. Vă rugăm să așteptați

Supraîncărcare funcţii şi operatori

Prezentări similare


Prezentarea pe tema: "Supraîncărcare funcţii şi operatori"— Transcriere de prezentare:

1 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

2 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).

3 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++;

4 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();

5 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();

6 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ă ?


Descărcați ppt "Supraîncărcare funcţii şi operatori"

Prezentări similare


Publicitate de la Google