C ++

Preopterećenje u C ++

Preopterećenje u C ++
C ++ ne dopušta funkciji koja dodaje dvije cijele vrijednosti i vraća cijeli broj, da doda dva plovka i vrati float. Zamislite da postoji funkcija za dodavanje dviju cijelih brojeva i vraćanje cijelog broja. Ne bi li bilo lijepo imati drugu funkciju s istim imenom, koja dodaje, ali dva ili više plutajućih za povratak plutajućeg slova? Kaže se da je to preopterećenje prve funkcije.

Aritmetički operatori obično se koriste za aritmetičke operacije. Nije li lijepo imati +, spojite dvije žice? Omogućavanje za koji se kaže da preopterećuje aritmetički operator zbrajanja za nizove.

Operator prirasta, ++ dodaje 1 na int ili float. Kada se radi s pokazivačima, on ne dodaje 1 pokazivaču. Usmjerava pokazivač na sljedeći uzastopni objekt u memoriji. Iterator usmjerava na sljedeći objekt na povezanom popisu, ali objekti povezanog popisa nalaze se na različitim mjestima u memoriji (ne u uzastopnim regijama). Ne bi li bilo lijepo preopteretiti operator prirasta za iterator, povećati, ali ukazati na sljedeći element, na povezanom popisu?

Ovaj članak objašnjava preopterećenje u C-u++. Podijeljen je u dva dijela: preopterećenje funkcije i preopterećenje operatera. Da biste razumjeli ostatak članka, potrebno je već osnovno znanje iz jezika C ++.

Sadržaj članka

Preopterećenje funkcije

Sljedeća funkcija dodaje dva inta i vraća int:

int dodati (int br1, int br2)

int zbroj = ne1 + ne2;
povratna suma;

Prototip ove funkcije je:
int dodati (int br1, int br2);
Prototip funkcije u zaglavlju funkcije, završavajući zarezom. Sljedeća funkcija s istim imenom, ali s drugim prototipom, dodala bi tri plovka i vratila plovak:
float dodaj (plutaj br. 1, plutaj br. 2, plutaj br. 3)

plutajući zbroj = no1 + no2 + no3;
povratna suma;

Kako kompajler razlikuje koju funkciju pozvati, budući da dvije ili više funkcija imaju isto ime? Prevoditelj koristi broj argumenata i tipova argumenata da odredi koju će funkciju pozvati. Popis parametara preopterećenih funkcija trebao bi se razlikovati po njihovom broju i / ili tipu parametara. Dakle, poziv funkcije,

int sm = dodaj (2,3);

bi pozvao cjelobrojnu funkciju, dok funkcija poziva,

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

nazvao bi funkciju float. Napomena: postoje situacije u kojima će prevodilac odbiti preopterećenu funkciju kada je broj argumenata jednak, ali različitih vrsta! - Razlog: - vidjeti kasnije.

Sljedeći program provodi gornje segmente koda u akciju:

#include
pomoću prostora imena std;
int dodati (int br1, int br2)

int zbroj = ne1 + ne2;
povratna suma;

float dodaj (plutaj br. 1, plutaj br. 2, plutaj br. 3)

plutajući zbroj = no1 + no2 + no3;
povratna suma;

int main ()

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

Izlaz je:
5
7.7

Preopterećenje operatera

Aritmetički operatori koriste se za preopterećenje operacija u vrstama klasa. Iterator je vrsta klase. Operatori prirasta i smanjenja koriste se za preopterećenje operacija za iterator.

Primjer preopterećenja operatora klase nizova

Ovaj odjeljak pruža primjer, gdje je + preopterećeno za jednostavno dizajniranu klasu nizova, koja se naziva proljetna klasa. + spaja literale dvaju objekata u nizu, vraćajući novi objekt s povezanim literalima. Spajanje dvaju doslovnih značenja znači spajanje drugog doslovnog na kraj prvog doslovnog.

Sada C ++ ima posebnu funkciju člana za sve klase, koja se naziva operator. Programer može koristiti ovu posebnu funkciju za preopterećenje operatora, kao što je +. Sljedeći program prikazuje preopterećenje operatora + za dva niza.

#include
pomoću prostora imena std;
razredno proljeće

javnost:
// članovi podataka
char val [100];
int n;
char concat [100];
// funkcije člana
opruga (char arr [])

za (int i = 0; i<100; ++i)
val [i] = arr [i];
ako (arr [i] == '\ 0')
pauza;

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

opruga operator + (spring & st)
int newLen = n + st.n;
char newStr [newLen + 1];
za (int i = 0; iza (int i = n; inewStr [newLen] = '\ 0';
proljetni obj (newStr);
povratak obj;

;
int main ()

char ch1 [] = "Mrzim te! "; opruga str1 (ch1);
char ch2 [] = "Ali ona te voli!"; opruga str2 (ch2);
char ch3 [] = "jedan"; opruga str3 (ch3);
str3 = str1 + str2;
cout<return 0;

Vrijednost str1 je "Mrzim te! ". Vrijednost str2 je "Ali ona te voli!". Vrijednost str3, koja je, str1 + str2, je izlaz:

"Mrzim te! Ali ona vas voli!"

što je spajanje dvaju nizanih literala. Sami nizovi su instancirani objekti.

Definicija funkcije operatora nalazi se unutar opisa (definicije) klase stringa. Počinje s povratnim tipom, "opruga" za "niz". Posebni naziv, "operater, slijedi ovo". Nakon toga slijedi simbol operatora (koji treba biti preopterećen). Zatim je popis parametara, koji je zapravo popis operanda. + je binarni operator: što znači da je potreban lijevi i desni operand. Međutim, prema specifikaciji C ++, popis parametara ovdje ima samo pravi parametar. Zatim je tijelo funkcije operatora, koje oponaša uobičajeno ponašanje operatora.

Prema specifikaciji C ++, definicija operatora + uzima samo desni parametar operanda, jer je ostatak opisa klase parametar lijevog operanda.

U gornjem kodu, samo je definicija funkcije + () zabrinuta za + preopterećenje. Ostatak koda za klasu je normalno kodiranje. Unutar ove definicije, dva se stringova literala spajaju u niz, newStr []. Nakon toga se zapravo stvara (instancira) novi objekt niza, koristeći argument, newStr []. Na kraju definicije funkcije operator + (), vraća se novostvoreni objekt koji ima spojeni niz.

U funkciji main () dodavanje se vrši izjavom:

str3 = str1 + str2;

Gdje su str1, str2 i str3 string objekti koji su već stvoreni u main (). Izraz "str1 + str2" sa svojim + poziva funkciju člana operatora + () u objektu str1. Funkcija člana + () u objektu str1 koristi str2 kao svoj argument i vraća novi objekt s (razvijenim) uvezanim nizom. Operator dodjele (=) cjelovitog izraza zamjenjuje sadržaj (vrijednosti varijabli) objekta str3 s onima vraćenog objekta. U funkciji main (), nakon dodavanja, vrijednost člana podataka str3.val više nije "jedan"; to je spojeni (zbrajni) niz, "Mrzim te! Ali ona vas voli!". Funkcija člana operatora + () u objektu str1 koristi literal niza vlastitog objekta i literal niza svog argumenta str2 kako bi smislila pridruženi literal niza.

Preopterećenje operatora iteratora

Kad se radi s iteratorom, uključena su najmanje dva objekta: povezani popis i sam iterator. Zapravo su uključene najmanje dvije klase: klasa iz koje je instanciran povezani popis i klasa iz koje je izrađen iterator.

Povezana lista

Dijagram za objekt s dvostruko povezanim popisom je:

Ovaj popis ima tri elementa, ali može biti i više. Tri elementa ovdje su elementi cijelih brojeva. Prvi ima vrijednost 14; sljedeći ima vrijednost 88; a posljednji ima vrijednost, 47. Svaki se element ovdje sastoji od tri uzastopna mjesta.

To je za razliku od niza, gdje je svaki element jedno mjesto, a svi se elementi niza nalaze na uzastopnim mjestima. Ovdje se različiti elementi nalaze na različitim mjestima u memorijskoj seriji, ali svaki se element sastoji od tri uzastopna mjesta.

Za svaki element, srednje mjesto drži vrijednost. Pravo mjesto ima pokazivač na sljedeći element. Lijevo mjesto ima pokazivač na prethodni element. Za posljednji element, pravo mjesto upućuje na teoretski kraj popisa. Za prvi element, lijevo mjesto pokazuje na teoretski početak popisa.

Pomoću polja, operator prirasta (++), povećava pokazivač kako bi ukazao na fizički sljedeće mjesto. Uz popis, elementi se ne nalaze u uzastopnim regijama u memoriji. Dakle, operator prirasta može biti preopterećen, pomaknite iterator (pokazivač) iz jednog elementa u logički sljedeći element. Ista projekcija odnosi se na operator dekrementa (-).

Naprijed iterator je iterator koji kada je angažiran pokazuje na sljedeći element. Obrnuti iterator je iterator koji kada se uključi usmjerava na prethodni element.

Preopterećenje ++ oglasa -

Preopterećenje ovih operatora vrši se u opisu klase (definiciji) iteratora.

Sintaksa za prototip preopterećenja operatora prirasta, prefiks, je

Operator povratne vrste ++ ();

Sintaksa za prototip preopterećenja operatora prirasta, postfix, je

Operator ReturnType ++ (int);

Sintaksa za prototip preopterećenja operatora dekrementa, prefiks, je

Operator povratne vrste - ();

Sintaksa za prototip preopterećenja operatora prirasta, postfix, je

Operator povratne vrste - (int);

Zaključak

Preopterećenje znači davanje funkcije ili operatora različitom značenju. Funkcije su preopterećene u istom opsegu. Ono što razlikuje preopterećene funkcije su broj i / ili vrste parametara na njihovim popisima parametara. U nekim slučajevima, kada je broj parametara jednak, ali s različitim vrstama, kompajler odbija preopterećenje - pogledajte kasnije. Mnogi se uobičajeni operatori mogu preopteretiti u klasama iz kojih se instanciraju objekti. To se postiže davanjem vrste povrata, popisa parametara i tijela posebnoj funkciji nazvanoj operator u opisu klase.

Lijevi gumb miša ne radi u sustavu Windows 10
Ako s prijenosnim računalom ili stolnim računalom koristite namjenski miš, ali lijevi gumb miša ne radi u sustavu Windows 10/8/7 iz nekog razloga evo ...
Pokazivač skače ili se slučajno pomiče dok tipkate u sustavu Windows 10
Ako ustanovite da kursor miša sam skače ili se pomiče automatski, nasumično dok tipkate u Windows prijenosnom računalu ili računalu, neki od ovih prij...
Kako obrnuti smjer pomicanja miša i dodirnih pločica u sustavu Windows 10
Miš i Dodirna pločaRačunarstvo ne samo da olakšava, već i učinkovitije i oduzima puno vremena. Ne možemo zamisliti život bez ovih uređaja, ali činjeni...