C ++

Supraîncărcare în C ++

Supraîncărcare în C ++
C ++ nu permite o funcție care adaugă două numere întregi și returnează un număr întreg, să adauge două flotante și să returneze un flotant. Imaginați-vă că există o funcție pentru a adăuga două numere întregi și a returna un număr întreg. Nu ar fi frumos să aveți o altă funcție cu același nume, care adaugă doar două sau chiar mai multe flotante pentru a returna un flotant? Făcând acest lucru se spune că este supraîncărcarea primei funcții.

Operatorii aritmetici sunt de obicei folosiți pentru operații aritmetice. Nu este frumos să ai +, alătură două șiruri? Activarea care se spune că este supraîncărcarea operatorului de adăugare aritmetică, pentru șiruri.

Operatorul de incrementare, ++ adaugă 1 la un int sau un float. Când se ocupă de pointeri, acesta nu adaugă 1 la pointer. Face ca indicatorul să indice următorul obiect consecutiv din memorie. Un iterator indică următorul obiect dintr-o listă legată, dar obiectele listei legate se află în diferite locuri din memorie (nu în regiuni consecutive). Nu ar fi frumos să supraîncărcați operatorul de incrementare pentru un iterator, să incrementați, dar să indicați următorul element din lista legată?

Acest articol explică supraîncărcarea în C++. Este împărțit în două părți: supraîncărcarea funcției și supraîncărcarea operatorului. Având deja cunoștințe de bază în C ++ este necesar pentru a înțelege restul articolului.

Conținutul articolului

Funcția de supraîncărcare

Următoarea funcție adaugă două inți și returnează un int:

int add (int nr1, int nr2)

int sumă = no1 + no2;
suma de returnare;

Prototipul acestei funcții este:
int add (int no1, int no2);
Prototipul unei funcții din antetul funcției, care se termină cu punct și virgulă. Următoarea funcție cu același nume, dar cu un prototip diferit, ar adăuga trei flotări și ar returna un flotant:
float add (float nr. 1, float nr. 2, float nr. 3)

float sum = no1 + no2 + no3;
suma de returnare;

Cum diferențiază compilatorul ce funcție să apeleze, deoarece două sau mai multe funcții au același nume? Compilatorul folosește numărul de argumente și tipurile de argumente pentru a determina ce funcție trebuie apelată. Lista de parametri a funcțiilor supraîncărcate ar trebui să difere în ceea ce privește numărul și / sau tipurile de parametri. Deci, apelul funcției,

int sm = add (2, 3);

ar apela funcția de număr întreg, în timp ce funcția de apel,

float sme = add (2.3, 3.4, 2.0);

ar numi funcția float. Notă: există situații în care compilatorul va respinge o funcție supraîncărcată atunci când numărul de argumente este același, dar de tipuri diferite! - Motiv: - vezi mai târziu.

Următorul program pune în acțiune segmentele de cod de mai sus:

#include
folosind spațiul de nume std;
int add (int nr1, int nr2)

int sumă = no1 + no2;
suma de returnare;

float add (float nr1, float nr2, float nr3)

float sum = no1 + no2 + no3;
suma de returnare;

int main ()

int sm = add (2, 3);
cout<float sme = add (2.3, 3.4, 2.0);
cout<retur 0;

Ieșirea este:
5
7.7

Supraîncărcarea operatorului

Operatorii aritmetici sunt utilizați pentru supraîncărcarea operațiunilor în tipuri de clase. Un iterator este un tip de clasă. Operatorii de creștere și descreștere sunt folosiți pentru supraîncărcarea operațiilor pentru un iterator.

Exemplu Supraîncărcarea operatorului clasei de șiruri

Această secțiune oferă un exemplu, în care + este supraîncărcat pentru o clasă de șir proiectată simplu, numită clasă de arc. + concatenează literele a două obiecte șir, returnând un obiect nou cu literele concatenate. Concatenarea a doi literali înseamnă alăturarea celui de-al doilea literal la sfârșitul primului literal.

Acum, C ++ are o funcție de membru specială pentru toate clasele, numită operator. Programatorul poate folosi această funcție specială pentru a supraîncărca operatorii, cum ar fi +. Următorul program arată supraîncărcarea operatorului + pentru două șiruri.

#include
folosind spațiul de nume std;
primăvara clasei

public:
// membrii de date
char val [100];
int n;
char concat [100];
// funcții de membru
primăvară (char arr [])

pentru (int i = 0; i<100; ++i)
val [i] = arr [i];
if (arr [i] == '\ 0')
pauză;

int i;
pentru (i = 0; i<100; ++i) if (arr[i] == '\0') break;
n = i;

operator de arc + (arc & st)
int newLen = n + st.n;
char newStr [newLen + 1];
pentru (int i = 0; ipentru (int i = n; inewStr [newLen] = '\ 0';
obiect de primăvară (newStr);
returnare obiect;

;
int main ()

char ch1 [] = "Te urăsc! "; arc str1 (ch1);
char ch2 [] = "Dar ea te iubește!"; arc str2 (ch2);
char ch3 [] = "unul"; arc str3 (ch3);
str3 = str1 + str2;
cout<retur 0;

Valoarea str1 este „Te urăsc! ". Valoarea str2 este „Dar ea te iubește!". Valoarea str3, care este, str1 + str2, este ieșirea:

"Vă urăsc! Dar ea te iubește!"

care este concatenarea celor două litere de șir. Șirurile în sine sunt obiecte instanțiate.

Definiția funcției operator se află în descrierea (definiția) clasei de șiruri. Începe cu tipul returnat, „arc” pentru „șir”. Numele special, „operator, urmează acest lucru”. După aceea, există simbolul operatorului (care trebuie supraîncărcat). Apoi, există lista de parametri, care este de fapt lista de operanzi. + este un operator binar: adică este nevoie de un operand stâng și unul drept. Cu toate acestea, conform specificației C ++, lista parametrilor de aici are doar parametrul corect. Apoi, există corpul funcției operator, care imită comportamentul obișnuit al operatorului.

Prin specificația C ++, definiția operatorului + ia doar parametrul de operand corect, deoarece restul descrierii clasei este parametrul de operand stâng.

În codul de mai sus, numai definiția funcției operatorului + () este preocupată de supraîncărcarea +. Restul codului clasei este codare normală. În interiorul acestei definiții, cele două litere ale șirului sunt concatenate în matrice, newStr []. După aceea, un nou obiect șir este creat (instanțiat), folosind un argument, newStr []. La sfârșitul definiției funcției operator + (), obiectul nou creat, având șirul concatenat, este returnat.

În funcția main (), adăugarea se face prin instrucțiunea:

str3 = str1 + str2;

În cazul în care str1, str2 și str3 sunt obiecte șir care au fost deja create în main (). Expresia, „str1 + str2” cu +, apelează funcția membru operator + () din obiectul str1. Funcția operator + () membru din obiectul str1 folosește str2 ca argument și returnează noul obiect cu (dezvoltat) șirul concatenat. Operatorul de atribuire (=) al instrucțiunii complete, înlocuiește conținutul (valorile variabilelor) obiectului str3, cu cele ale obiectului returnat. În funcția main (), după adăugare, valoarea membrului de date str3.val nu mai este „unul”; este șirul concatenat (adăugare) „Te urăsc! Dar ea te iubește!". Funcția membru operator + () din obiectul str1, folosește propriul literal șir al obiectului și literalul șir al argumentului său, str2 pentru a veni cu un literal șir alăturat.

Iterator Operator Suprasolicitare

Atunci când aveți de-a face cu iteratorul, sunt implicate cel puțin două obiecte: o listă legată și iteratorul în sine. De fapt, sunt implicate cel puțin două clase: o clasă din care este instanțiată o listă legată și o clasă din care este instanțiat un iterator.

Listă legată

O diagramă pentru un obiect dublu legat este:

Această listă are trei elemente, dar pot fi mai multe. Cele trei elemente de aici sunt elemente ale numerelor întregi. Primul are valoarea, 14; următorul are valoarea, 88; iar ultima are valoarea, 47. Fiecare element este format din trei locații consecutive.

Acest lucru este diferit de matrice, unde fiecare element este o singură locație și toate elementele matricei sunt în locații consecutive. Aici, diferitele elemente se află în locuri diferite din seria de memorie, dar fiecare element constă din trei locații consecutive.

Pentru fiecare element, locația din mijloc deține valoarea. Locația corectă are indicatorul către următorul element. Locația din stânga are indicatorul către elementul anterior. Pentru ultimul element, locația corectă indică un sfârșit teoretic al listei. Pentru primul element, locația din stânga indică un început teoretic al listei.

Cu tabloul, operatorul de creștere (++), crește indicatorul pentru a indica următoarea locație fizică. Cu lista, elementele nu se află în regiuni consecutive în memorie. Deci, operatorul de incrementare poate fi supraîncărcat, mutați iteratorul (pointerul) de la un element la următorul element logic. Aceeași proiecție se aplică operatorului de decrement (-).

Un iterator înainte este un iterator care, atunci când este angajat, indică următorul element. Un iterator invers este un iterator, care, atunci când este angajat, indică elementul anterior.

Anunț de suprasolicitare ++ -

Supraîncărcarea acestor operatori se face în descrierea clasei (definiția) iteratorului.

Sintaxa pentru prototipul supraîncărcării operatorului de increment, prefix, este

ReturnType operator ++ ();

Sintaxa pentru prototipul supraîncărcării operatorului de incrementare, postfix, este

ReturnType operator ++ (int);

Sintaxa pentru prototipul supraîncărcării operatorului decrement, prefix, este

ReturnType operator - ();

Sintaxa pentru prototipul supraîncărcării operatorului de incrementare, postfix, este

ReturnType operator - (int);

Concluzie

Supraîncărcarea înseamnă a da un sens diferit unei funcții sau unui operator. Funcțiile sunt supraîncărcate în același domeniu. Ceea ce diferențiază funcțiile supraîncărcate sunt numărul și / sau tipurile de parametri din listele lor de parametri. În unele cazuri, unde numărul parametrilor este același, dar cu tipuri diferite, compilatorul respinge supraîncărcarea - vezi mai târziu. Mulți operatori obișnuiți pot fi supraîncărcați în clase din care sunt instanțiate obiecte. Acest lucru se face dând un tip de returnare, o listă de parametri și un corp, funcției speciale numite, operator, în descrierea clasei.

Vulkan for Linux Users
With each new generation of graphics cards, we see game developers push the limits of graphical fidelity and come one step closer to photorealism. But...
OpenTTD vs Simutrans
Creating your own transport simulation can be fun, relaxing and extremely enticing. That's why you need to make sure that you try out as many games as...
OpenTTD Tutorial
OpenTTD is one of the most popular business simulation games out there. In this game, you need to create a wonderful transportation business. However,...