Oop 07 Lek funcția supraîncărcării

Funcție supraîncărcării ________________________________________________________________ 1

Scopul de suprasarcină __________________________________________________________________ 1 compilator numele de funcții de decorare ________________________________________________ 2 funcții de suprasarcină _____________________________________________________________________ 2 constructori de suprasarcină ________________________________________________________________ 3 Ambiguitatea de suprasarcină _____________________________________________________________ 3

Supraîncărcarea Funcția - este unul dintre tipurile de polimorfism furnizate de C ++. În C ++, mai multe funcții pot avea același nume. În acest caz, funcția identificată de către același nume, numit supraîncărcat. Reboot singurele caracteristici care sunt diferite, sau de tipul sau numărul de argumentele lor. Funcții de suprasarcină care diferă numai în tipul de retur,

este imposibil. funcții supraîncărcate permit simplificarea programului, care să permită tratamentul unui singur nume pentru punerea în aplicare a acțiunii sens similar.

Pentru a supraîncărca o funcție, trebuie doar să declare, și apoi să stabilească toate opțiunile necesare pentru apelul. Compilatorul va alege automat versiunea corectă a apelului, pe baza numărului și tipului de argumente. exemplu:

// functii prototipuri supraîncărcat

// funcție primește și returnează un număr întreg

float abs (float);

// functie opereaza cu un numar de punct Floating

double abs (double);

// funcție operează cu numărul real de dublă precizie

float mF. F = -25.0f; dublu mD. D = -2.55;

// numesc ABS funcția supraîncărcată (int)

// numesc ABS funcția supraîncărcată (float)

// numesc ABS funcția supraîncărcată (dublu)

cout <<'|' <

float abs (float a)

cout<<"abs(float)\t"; return a <0. –a. a ;

abs dublu (dublu a)

cout<<"abs(double)\t"; return a <0. –a. a ;

Atunci când programul afișează:

MENT. Astfel, în acest exemplu, este realizată la suprasarcină abs () funcția. ceea ce face mai ușor de programat. În funcție de argumentul trecut la opțiunea dorită este numită funcția.

Acest exemplu arată modul de utilizare a Supraîncărcarea poate simplifica codul, permițând programatorului să folosească o funcție, argumentele care sunt transmise de diferite tipuri. Desigur, posibilitatea de a folosi congestia exigențe ridicate de pe compilator.

Decorarea numele funcțiilor compilator

Pentru a pune în aplicare conceptul de suprasarcină, dezvoltatorii compilatoare C ++ a trebuit să introducă nume de decorare. Acest lucru înseamnă că toate funcțiile din codul de program produs de nume de compilator bazate pe numele dat de programator, și numărul și tipurile de argumente. Compilatoare diferite fac oarecum diferite una de alta cale. Aici vom descrie, la fel ca firma Inprise compilatorul (fosta - firma Borland).

La început, există simbolul „@“ și numele clasei, apoi simbolul „@“ și numele funcției, toate datele de identificare sunt sensibile la caz. Aceasta este urmată de o secvență de caractere „@q“, din care sunt codificate notatie parametrii funcției. Să facă referire la indicii și referințe la codurile încorporate tipuri sunt adăugate literele „p“ și „r“, respectiv. De exemplu, în cazul dat o definiție de clasă:

nule SetVal (void); nule SetVal (int);

void SetVal (int * dublu.); void SetVal (int . int. float);

compilator Borland C ++ va genera nume de astfel de funcții:

Acest lucru indică faptul că valoarea de returnare nu ia parte la decorarea nume. Din acest motiv, nu poate fi supraîncărcat funcții care diferă numai în tipul de retur. Pentru a face cu modul de a decora numele de compilator specific este destul de ușor. Este suficient să-l solicite să emită un text program de asamblare echivalent.

int func (int); int func (int );

Aceasta va duce la eroare, deoarece în ceea ce privește congestionarea, acestea sunt considerate egale.

Argumentele de funcții legate de un anumit tip constantei modificate sau volatile. Nu este tratată distinct de tipul de bază în ceea ce privește suprasarcină.

Pointerii la Const - volatile și -objects, de asemenea, să nu fie considerate ca fiind distincte de indicii pentru tipul de bază în ceea ce privește suprasarcină.

Cu toate acestea, mecanismul de suprasarcină poate distinge link-uri care sunt modificatori Const și volatile. și trimiterile la tipul de bază.

Cu toate acestea, la funcțiile supraaglomerate se suprapun mai multe limitări: oricare două funcții supraîncărcate trebuie să aibă liste diferite de parametri;

Funcții de suprasarcină cu aceleași liste argument bazat pe un tip de valoarea returnată este nevalid;

funcții membre nu poate fi supraîncărcat bazată exclusiv pe faptul că unul dintre ele este static, iar celălalt - nu;

enum -types toate datele sunt tratate ca fiind diferite și pot fi utilizate pentru a distinge funcțiile supraîncărcate;

Tipuri de „matrice (ceva)“ și „pointer (ceva)“ considerate ca fiind identice în ceea ce privește suprasarcină.

typedef nu afectează mecanismul Găsește-suprasarcină, deoarece acestea nu introduc noi tipuri de date, și de a determina numai sinonime pentru tipurile existente.

De exemplu, această definiție typedef char * PSTR;

nu va permite compilatorului să ia în considerare următoarele două funcții

anula SetVal (char * sz); void SetVal (sz PSTR);

Pentru matrice multidimensionale, a doua și următoarele dimensiuni sunt considerate ca făcând parte din tipul de date. Prin urmare, ele pot fi folosite pentru a diferenția între funcțiile supraîncărcate. De exemplu, poate avea următoarele definiții:

nule SetVal (char [] S); nule SetVal (char S [] [4]);

Cel mai des folosit pentru a crea o supraîncărcare supraîncărcat constructori (supraîncărcare destructor nu poate fi!). Scopul acestei supraîncărcare este dorința de a oferi utilizatorului cât mai mult posibil opțiuni pentru stabilirea membrilor clasei. De fapt, ne-am întâlnit deja în mai multe rânduri cu constructorii de suprasarcină, cu toate că nu a vorbit despre asta. În cazul în care clasa oferă un constructor cu parametrii si constructorul implicit, avem de-a face cu o supraîncărcare de designeri. După cum știm deja, este necesar constructorul implicit pentru alocarea dinamică a memoriei dintr-o serie de obiecte (pentru o gamă dinamică de obiecte nu poate fi inițializat).

Un alt caz este atunci când există o nevoie de a constructorilor de suprasarcina - dorinta de a furniza utilizatorului cu tipul de designeri de conversie.

Am găsit o potrivire exactă; deține transformarea trivială;

un tipuri întregi de conversie; există o conversie standard la tipul dorit de argument;

există o transformare definită de programator (operator de transformare sau un designer) la tipul dorit de argument;

s-au găsit argumentele prezentate de puncte.

Compilatorul generează un set de funcții de candidat pentru conformitate pentru fiecare argument. Apoi, pentru fiecare argument este construit set de funcții care corespund cel mai bun mod posibil. Nako-

Heff funcție care se potrivește cel mai bine apelul ca intersecție a acestor seturi definite. Dacă această intersecție conține câteva funcții - suprasarcină este ambiguă, iar compilatorul generează un mesaj de eroare.

O altă observație importantă. Funcții ambiguității supraîncărcat nu poate fi determinată, până la un apel de funcție.

Funcția cu n argumente în mod implicit, din punctul de vedere al argumentelor potrivite, privite ca o combinație de n + 1 funcții, fiecare dintre care diferă de la un argument sarcină suplimentară anterior. (.) Dots acționează caracter ca arbitrar: acesta corespunde oricărui argument dat. Acest lucru poate fi o sursă de ambiguitate în selectarea unei funcții supraîncărcate.

Toate cele de mai sus se aplică tuturor funcțiilor supraaglomerate, fără a ține cont dacă acestea sunt funcțiile de membru sau nu. Să luăm acum în considerare specificul funcțiilor membre supraîncărcat.

funcții de clasă membru sunt luate în considerare în mod diferit în funcție de faptul dacă acestea sunt statice sau nu declarate, deoarece funcțiile de bază non-statice au un argument implicit, care primește un pointer la acest lucru. Pentru a determina funcția pe care se potrivește cel mai bine apelul pentru funcțiile de membru non-statice sunt considerate doar acele funcții membre supraîncărcat care au ascuns acest indicator corespunde tipului de obiect care este trecut la funcția fiind numit. Spre deosebire de alte argumente atunci când încearcă să stabilească conformitatea cu acest argument pointer, nici o conversie se efectuează.

A declarat cu constructorul specificatorul explicit. nu participă la conversia de tip implicită. Acesta poate fi utilizat numai în cazul în care nu este necesară nici un argument tip de conversie. De exemplu, pentru o clasă declarată de mai sus:

articole similare