C ++

Preobremenitev v jeziku C ++

Preobremenitev v jeziku C ++
C ++ ne dovoljuje, da funkcija, ki doda dve celi števili in vrne celo število, doda dve plovki in vrne plovec. Predstavljajte si, da obstaja funkcija za dodajanje dveh celih števil in vrnitev celega števila. Ali ne bi bilo lepo imeti drugo funkcijo z istim imenom, ki doda, vendar dva ali celo več plovcev, ki vrnejo plovec? S tem naj bi se preobremenilo prvo funkcijo.

Aritmetični operatorji se običajno uporabljajo za aritmetične operacije. Ali ni lepo imeti +, združite dva niza? Omogočanje, ki naj bi preobremenilo operater aritmetičnega seštevanja za nize.

Operator prirastka ++ doda 1 v int ali float. Pri obravnavi kazalcev kazalcu ne doda 1. Kazalec kaže na naslednji zaporedni objekt v pomnilniku. Iterator kaže na naslednji objekt na povezanem seznamu, vendar so predmeti s povezanim seznamom na različnih mestih v pomnilniku (ne v zaporednih regijah). Ali ne bi bilo lepo preobremeniti operator prirastka za iterator, povečati, ampak usmeriti na naslednji element v povezanem seznamu?

Ta članek pojasnjuje preobremenitev v jeziku C++. Razdeljen je na dva dela: preobremenitev funkcije in preobremenitev operaterja. Za razumevanje preostalega članka je potrebno že osnovno znanje jezika C ++.

Vsebina članka

Preobremenitev funkcije

Naslednja funkcija doda dva inta in vrne int:

int dodaj (int št1, int št2)

int vsota = no1 + no2;
vrnjena vsota;

Prototip te funkcije je:
int add (int no1, int no2);
Prototip funkcije v glavi funkcije, ki se konča s podpičjem. Naslednja funkcija z istim imenom, vendar z drugačnim prototipom, bi dodala tri plovke in vrnila plovec:
float add (float no1, float no2, float no3)

float vsota = no1 + no2 + no3;
vrnjena vsota;

Kako prevajalnik razlikuje, katero funkcijo naj pokliče, saj imata dve ali več funkcij isto ime? Prevajalnik s pomočjo števila argumentov in vrst argumentov določi, katero funkcijo naj pokliče. Seznam parametrov preobremenjenih funkcij se mora razlikovati po njihovem številu in / ali vrstah parametrov. Torej, klic funkcije,

int sm = dodaj (2, 3);

bi poklical celoštevilčno funkcijo, medtem ko funkcija pokliče,

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

bi poklical funkcijo float. Opomba: v nekaterih primerih bo prevajalnik zavrnil preobremenjeno funkcijo, če je število argumentov enako, vendar različnih vrst! - Razlog: - glej kasneje.

Naslednji program sproži zgornje segmente kode:

#include
uporaba imenskega prostora std;
int dodaj (int št1, int št2)

int vsota = no1 + no2;
vrnjena vsota;

float add (float no1, float no2, float no3)

float vsota = no1 + no2 + no3;
vrnjena vsota;

int main ()

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

Rezultat je:
5
7.7

Preobremenitev operaterja

Aritmetični operatorji se uporabljajo za preobremenitev operacij v vrstah razredov. Ponavljalec je vrsta razreda. Operatorja prirastka in zmanjšanja se uporabljata za preobremenitev operacij za iterator.

Primer preobremenitve operaterja nizovnega razreda

Ta odsek ponuja primer, kjer je + preobremenjen za preprosto oblikovan razred nizov, imenovan vzmetni razred. + združuje literale dveh nizovnih predmetov in z združenimi literali vrne nov objekt. Združevanje dveh dobesednih znakov pomeni povezovanje druge dobesedne do konca prve dobesedne.

Zdaj ima C ++ posebno funkcijo člana za vse razrede, imenovano operator. Programer lahko s to posebno funkcijo preobremeni operaterje, kot je +. Naslednji program prikazuje preobremenitev operatorja + za dva niza.

#include
uporaba imenskega prostora std;
razred pomlad

javno:
// podatki člani
char val [100];
int n;
char concat [100];
// funkcije člana
vzmet (char arr [])

za (int i = 0; i<100; ++i)
val [i] = arr [i];
če (arr [i] == '\ 0')
odmor;

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

vzmetni operater + (vzmet & st)
int newLen = n + st.n;
char newStr [newLen + 1];
za (int i = 0; iza (int i = n; inewStr [newLen] = '\ 0';
pomlad obj (newStr);
vrni obj;

;
int main ()

char ch1 [] = "Sovražim te! "; vzmet str1 (ch1);
char ch2 [] = "Ampak ona te ima rada!"; vzmet str2 (ch2);
char ch3 [] = "ena"; vzmet str3 (ch3);
str3 = str1 + str2;
cout<vrnitev 0;

Vrednost str1 je "Sovražim te! ". Vrednost str2 je "Ampak ona te ima rada!". Vrednost str3, ki je, str1 + str2, je izhod:

"Sovražim te! Ampak ona te ima rada!"

kar je združitev dveh nizovnih literal. Strune same so primerki.

Definicija operatorjske funkcije je znotraj opisa (definicije) razreda niza. Začne se s tipom return, "spring" za "string". Posebno ime, "operator, sledi temu". Po tem je simbol operaterja (ki ga je treba preobremeniti). Potem je tu še seznam parametrov, ki je pravzaprav seznam operandov. + je binarni operator: kar pomeni, da ima levi in ​​desni operand. Vendar ima po specifikaciji C ++ seznam parametrov tukaj le pravi parameter. Potem je tu telo funkcije operatorja, ki posnema običajno vedenje operaterja.

V specifikaciji C ++ definicija operaterja + sprejme samo desni parameter operanda, ker je preostali opis razreda levi parameter operanda.

V zgornji kodi se samo preobremenitev + ukvarja z definicijo funkcije operator + (). Preostala koda za razred je običajno kodiranje. Znotraj te definicije sta dva nizovna literala združena v matriko, newStr []. Po tem se dejansko ustvari (ustvari primerek) nov nizni objekt z uporabo argumenta newStr []. Na koncu definicije funkcije operator + () se vrne novo ustvarjeni objekt s povezanim nizom.

V funkciji main () se doda stavek:

str3 = str1 + str2;

Kjer so str1, str2 in str3 nizni predmeti, ki so že bili ustvarjeni v main (). Izraz "str1 + str2" s svojim + pokliče funkcijo člana operaterja + () v objektu str1. Funkcija člana operator (+) v objektu str1 kot argument uporablja str2 in vrne novi objekt z (razvitim) povezanim nizom. Operator dodelitve (=) celotnega stavka nadomesti vsebino (vrednosti spremenljivk) predmeta str3 z vsebino vrnjenega predmeta. V funkciji main () je po dodajanju vrednost podatkovnega člana str3.val ni več "eno"; to je združeni niz ("dodatek") "Sovražim te! Ampak ona te ima rada!". Funkcija člana operaterja + () v objektu str1 za uporabo združenega nizovnega literala uporablja niz literale lastnega predmeta in niz literala argumenta str2.

Preobremenitev operaterja iteratorja

Pri obravnavi iteratorja sta vključena vsaj dva predmeta: povezani seznam in iterator sam. V resnici sta vključena vsaj dva razreda: razred, iz katerega je ustvarjen primerek povezanega seznama, in razred, iz katerega je instantiran iterator.

Povezani seznam

Diagram za objekt z dvojno povezanim seznamom je:

Ta seznam ima tri elemente, lahko pa jih je tudi več. Tu so trije elementi celih števil. Prva ima vrednost 14; naslednji ima vrednost 88; in zadnji ima vrednost 47. Vsak element je sestavljen iz treh zaporednih lokacij.

To je v nasprotju z matriko, kjer je vsak element na enem mestu in so vsi elementi matrike na zaporednih mestih. Tu so različni elementi na različnih mestih v pomnilniški seriji, vendar je vsak element sestavljen iz treh zaporednih lokacij.

Za vsak element ima vrednost srednja lokacija. Na pravi lokaciji je kazalec na naslednji element. Na levi lokaciji je kazalec na prejšnji element. Za zadnji element prava lokacija kaže na teoretični konec seznama. Za prvi element leva lokacija kaže na teoretični začetek seznama.

Z matriko operator prirastka (++) poveča kazalec, da kaže na fizično naslednjo lokacijo. Pri seznamu elementi niso v zaporednih regijah v pomnilniku. Torej, operator prirastka je lahko preobremenjen, iterator (kazalec) premaknite iz enega elementa v logično naslednji element. Ista projekcija velja za operator zmanjšanja (-).

Posrednik iterator je iterator, ki ob vključitvi kaže na naslednji element. Povratni iterator je iterator, ki ob vključitvi kaže na prejšnji element.

Preobremenitev ++ oglasa -

Preobremenitev teh operatorjev se izvede v opisu razreda (definiciji) iteratorja.

Sintaksa za prototip preobremenitve operatorja prirastka, predpona, je

Operator ReturnType ++ ();

Sintaksa za prototip preobremenitve operatorja prirastka, postfix, je

Operator ReturnType ++ (int);

Sintaksa prototipa preobremenitve operaterja dekrementa, predpona, je

Operator ReturnType - ();

Sintaksa za prototip preobremenitve operatorja prirastka, postfix, je

Operator ReturnType - (int);

Zaključek

Preobremenitev pomeni, da funkcija ali operater dobi drugačen pomen. Funkcije so preobremenjene v istem obsegu. Kar razlikuje preobremenjene funkcije, je število in / ali vrste parametrov na njihovih seznamih parametrov. V nekaterih primerih, kadar je število parametrov enako, vendar z različnimi vrstami, prevajalnik zavrne preobremenitev - glej kasneje. Številne navadne operatorje je mogoče preobremeniti v razredih, iz katerih se ustvarijo primeri. To se naredi tako, da se posebni funkciji, imenovani operator, v opisu razreda poda vrnitev tipa, seznam parametrov in telo.

10 najboljših iger za igranje v Ubuntuju
Platforma Windows je bila ena izmed prevladujočih platform za igre na srečo zaradi velikega odstotka iger, ki se danes razvijajo za naravno podporo si...
5 najboljših arkadnih iger za Linux
Dandanes so računalniki resni stroji, ki se uporabljajo za igre na srečo. Če ne boste mogli dobiti novega visokega rezultata, boste vedeli, kaj mislim...
Bitka za Wesnoth 1.13.6 Razvoj izdan
Bitka za Wesnoth 1.13.6, ki je izšel prejšnji mesec, je šesta razvojna izdaja v 1.13.x series in prinaša številne izboljšave, predvsem uporabniški vme...