C ++

Perkrovimas C ++

Perkrovimas C ++
C ++ neleidžia funkcijos, kuri prideda du skaičius ir grąžina sveiką skaičių, kad pridėtų dvi plūdes ir grąžintų plūdę. Įsivaizduokite, kad yra funkcija pridėti du sveikus skaičius ir grąžinti sveiką skaičių. Ar nebūtų malonu turėti kitą funkciją tuo pačiu pavadinimu, kuri prideda tik dvi ar net daugiau plūdžių, kad grąžintų plūdę? Sakoma, kad taip darant, perkraunama pirmoji funkcija.

Aritmetikos operatoriai paprastai naudojami aritmetinėms operacijoms. Ar nėra malonu turėti +, sujunkite dvi stygas? Sakoma, kad tai leidžia perkelti aritmetinio pridėjimo operatorių eilutėms.

Prieauglio operatorius ++ prideda 1 prie int arba float. Kalbant apie rodykles, prie rodyklės nepridedama 1. Tai priverčia rodyklę nukreipti į kitą atmintyje esantį objektą. Kartotojas nurodo kitą objektą susietame sąraše, tačiau susieto sąrašo objektai yra skirtingose ​​atminties vietose (ne iš eilės einančiuose regionuose). Ar nebūtų malonu perkrauti prieaugio operatorių iteratoriui, kad padidintumėte, bet nurodykite šį susietojo sąrašo elementą?

Šiame straipsnyje paaiškinamas C perkrovimas++. Jis yra padalintas į dvi dalis: funkcijų perkrova ir operatoriaus perkrova. Turite jau pagrindinių žinių C ++ kalba, kad suprastumėte likusią straipsnio dalį.

Straipsnio turinys

Funkcija Perkrovimas

Ši funkcija prideda du intus ir grąžina int:

int pridėti (int no1, int no2)

int suma = no1 + no2;
grąžinimo suma;

Šios funkcijos prototipas yra:
int pridėti (int no1, int no2);
Funkcijos prototipas funkcijos antraštėje, baigiantis kabliataškiu. Ši funkcija su tuo pačiu pavadinimu, bet su skirtingu prototipu pridėtų tris plūdes ir grąžintų plūdę:
plūdės pridėjimas (plūdė nr1, plūdė nr2, plūdė nr3)

plūdinė suma = no1 + no2 + no3;
grąžinimo suma;

Kaip kompiliatorius atskiria, kurią funkciją iškviesti, nes dvi ar daugiau funkcijų turi tą patį pavadinimą? Kompiliatorius naudoja argumentų skaičių ir argumentų tipus, norėdamas nustatyti, kurią funkciją iškviesti. Perkrautų funkcijų parametrų sąrašas turėtų skirtis pagal jų skaičių ir (arba) parametrų tipus. Taigi, funkcijos iškvietimas,

int sm = pridėti (2, 3);

iškvies sveikąją funkciją, o funkcija iškvies,

plūdė sme = pridėti (2.3, 3.4, 2.0);

iškviestų plūdės funkciją. Pastaba: yra situacijų, kai kompiliatorius atmes perkrautą funkciją, kai argumentų skaičius yra vienodas, bet skirtingų tipų! - Priežastis: - žr. Vėliau.

Ši programa įgyvendina pirmiau nurodytus kodo segmentus:

# įtraukti
naudojant vardų sritį std;
int pridėti (int no1, int no2)

int suma = no1 + no2;
grąžinimo suma;

plūdės pridėjimas (plūdė nr1, plūdė nr2, plūdė nr3)

plūdinė suma = no1 + no2 + no3;
grąžinimo suma;

int main ()

int sm = pridėti (2, 3);
cout<plūdė sme = pridėti (2.3, 3.4, 2.0);
cout<grąžinti 0;

Rezultatas yra:
5
7.7

Operatoriaus perkrova

Aritmetiniai operatoriai naudojami perkraunant klasių tipų operacijas. Kartotuvas yra klasės tipas. Prieaugio ir mažinimo operatoriai naudojami iteratoriaus operacijoms perkrauti.

Styginių klasės operatoriaus perkrovos pavyzdys

Šiame skyriuje pateikiamas pavyzdys, kai + yra perkrauta paprasčiausiai sukurta stygų klase, vadinama spyruokline klase. + sujungia dviejų styginių objektų literalius, sugrąžindami naują objektą su sujungtais literalais. Sujungti du literalus reiškia prijungti antrąjį literalą prie pirmojo literato pabaigos.

Dabar C ++ turi specialią nario funkciją visoms klasėms, vadinamą operatoriumi. Programuotojas gali naudoti šią specialią funkciją perkrauti operatorius, pvz +. Ši programa rodo dviejų eilučių operatoriaus + perkrovą.

# įtraukti
naudojant vardų sritį std;
klasės pavasaris

vieša:
// duomenų nariai
char val [100];
int n;
char concat [100];
// nario funkcijos
pavasaris (char arr [])

už (int i = 0; i<100; ++i)
val [i] = arr [i];
jei (arr [i] == '\ 0')
pertrauka;

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

pavasario operatorius + (pavasaris ir šv.)
int newLen = n + st.n;
char newStr [newLen + 1];
už (int i = 0; iuž (int i = n; inewStr [newLen] = '\ 0';
pavasario obj (newStr);
grąžinimo obj;

;
int main ()

char ch1 [] = "Aš tavęs nekenčiu! "; spyruoklė str1 (ch1);
char ch2 [] = "Bet ji tave myli!"; spyruoklė str2 (ch2);
char ch3 [] = "vienas"; spyruoklė str3 (ch3);
str3 = str1 + str2;
cout<grąžinti 0;

Str1 reikšmė yra „Aš tavęs nekenčiu! ". Str2 vertė yra „Bet ji tave myli!". Str3, ty str1 + str2, reikšmė yra išvestis:

"Aš tavęs nekenčiu! Bet ji tave myli!"

kuris yra dviejų styginių literalų sujungimas. Pačios stygos yra momentiniai objektai.

Operatoriaus funkcijos apibrėžimas yra eilutės klasės aprašyme (apibrėžime). Jis prasideda grąžinimo tipu „spyruoklė“ „stygai“. Specialus pavadinimas „operatorius, sekite šį“. Po to yra operatoriaus simbolis (turi būti perkrautas). Tada yra parametrų sąrašas, kuris iš tikrųjų yra operando sąrašas. + yra dvejetainis operatorius: tai reiškia, kad tam reikalingas kairysis ir dešinysis operandas. Tačiau pagal C ++ specifikaciją parametrų sąraše yra tik tinkamas parametras. Tada yra operatoriaus funkcijos kūnas, imituojantis įprastą operatoriaus elgesį.

Pagal C ++ specifikaciją, operatoriaus + apibrėžimas apima tik dešinįjį operando parametrą, nes likusi klasės aprašymo dalis yra kairysis operando parametras.

Pirmiau pateiktame kode tik operatoriaus + () funkcijos apibrėžimas yra susijęs su + perkrova. Likęs klasės kodas yra įprastas kodavimas. Šiame apibrėžime du eilutės literalai yra susieti į masyvą newStr []. Po to, naudojant argumentą, newStr [] faktiškai sukuriamas (egzempliorius) naujas eilutės objektas. Pasibaigus operatoriaus + () funkcijos apibrėžimui, grąžinamas naujai sukurtas objektas, turintis susietą eilutę.

Pagrindinėje () funkcijoje pridėjimas atliekamas sakiniu:

str3 = str1 + str2;

Kur str1, str2 ir str3 yra eilutės objektai, kurie jau sukurti main (). Išraiška „str1 + str2“ su + iškviečia operatoriaus + () nario funkciją str1 objekte. Operatoriaus + () nario funkcija str1 objekte naudoja str2 kaip savo argumentą ir grąžina naują objektą su (išplėtota) sujungta eilute. Užbaigto sakinio priskyrimo operatorius (=) pakeičia str3 objekto turinį (kintamųjų reikšmes) grąžinamo objekto turiniu (=). Pagrindinėje () funkcijoje, po pridėjimo, duomenų nario str3 reikšmė.val nebėra „vienas“; tai sujungta (papildoma) eilutė: „Aš tavęs nekenčiu! Bet ji tave myli!". Operatoriaus + () nario funkcija str1 objekte naudoja savo objekto eilutės literalį ir savo argumento eilutės literal str2, kad sugalvotų sujungtą eilutės literalį.

Iteratoriaus operatoriaus perkrova

Kalbant apie iteratorių, dalyvauja mažiausiai du objektai: susietasis sąrašas ir pats iteratorius. Tiesą sakant, dalyvauja mažiausiai dvi klasės: klasė, iš kurios sukuriamas susietasis sąrašas, ir klasė, iš kurios yra kartojamas iteratorius.

Susietas sąrašas

Dvigubai susietų objektų diagrama yra:

Šiame sąraše yra trys elementai, tačiau jų gali būti ir daugiau. Trys elementai yra sveikųjų skaičių elementai. Pirmojo vertė yra 14; kito vertė yra 88; o paskutinė turi vertę 47. Kiekvienas elementas čia susideda iš trijų vienas po kito einančių vietų.

Tai nepanašu į masyvą, kur kiekvienas elementas yra viena vieta, o visi masyvo elementai yra iš eilės. Čia skirtingi elementai yra skirtingose ​​atminties serijos vietose, tačiau kiekvienas elementas susideda iš trijų vienas po kito einančių vietų.

Kiekvieno elemento vertė yra vidurinėje vietoje. Tinkamoje vietoje yra rodyklė į kitą elementą. Kairėje vietoje yra žymeklis į ankstesnį elementą. Paskutinio elemento teisinga vieta nurodo teorinę sąrašo pabaigą. Pirmojo elemento kairė vieta nurodo teorinę sąrašo pradžią.

Naudodamas masyvą, prieaugio operatorius (++) padidina žymeklį, kad jis nurodytų fiziškai kitą vietą. Naudojant sąrašą, elementai nėra atmintyje iš eilės esančiuose regionuose. Taigi prieaugio operatorius gali būti perkrautas, perkelkite iteratorių (rodyklę) iš vieno elemento į logiškai kitą elementą. Ta pati projekcija taikoma ir mažinimo operatoriui (-).

Pirmyn esantis iteratorius yra iteratorius, kurį įjungus nurodomas kitas elementas. Atvirkštinis iteratorius yra iteratorius, kurį įjungus nurodomas ankstesnis elementas.

Perkraunama ++ reklama -

Šių operatorių perkrova atliekama iteratoriaus klasės aprašyme (apibrėžime).

Prieauginio operatoriaus perkrovos, priešdėlio, prototipo sintaksė yra

„ReturnType“ operatorius ++ ();

Prieauginio operatoriaus perkrovos, postfix, prototipo sintaksė yra

„ReturnType“ operatorius ++ (int);

Sumažinimo operatoriaus perkrovos, priešdėlio, prototipo sintaksė yra

„ReturnType“ operatorius - ();

Prieauginio operatoriaus perkrovos, postfix, prototipo sintaksė yra

„ReturnType“ operatorius - (int);

Išvada

Perkrovimas reiškia kitokios funkcijos ar operatoriaus reikšmės suteikimą. Funkcijos yra perkrautos toje pačioje srityje. Perkrautas funkcijas išskiria parametrų skaičius ir (arba) tipai jų parametrų sąrašuose. Kai kuriais atvejais, kai parametrų skaičius yra vienodas, tačiau naudojant skirtingus tipus, kompiliatorius atmeta perkrovą - žr. Vėliau. Daugelis paprastų operatorių gali būti perkrauti klasėse, iš kurių objektai yra momentiniai. Tai daroma suteikiant grąžinimo tipą, parametrų sąrašą ir tekstą specialiai funkcijai, pavadintai operatorius, klasės aprašyme.

Įdiekite naujausią „Dolecin Emulator“, skirtą „Gamecube“ ir „Wii“, sistemoje „Linux“
„Delfinų emuliatorius“ leidžia žaisti pasirinktus „Gamecube“ ir „Wii“ žaidimus „Linux“ asmeniniuose kompiuteriuose (PC). „Dolphin Emulator“ yra laisv...
Kaip naudoti „GameConqueror Cheat Engine“ sistemoje „Linux“
Straipsnyje pateikiamas „GameConqueror“ apgaulės variklio naudojimo „Linux“ vadove. Daugelis žaidėjų, žaidžiančių sistemoje „Windows“, dažnai naudoja ...
Geriausi „Linux“ žaidimų konsolių emuliatoriai
Šiame straipsnyje bus išvardyta populiari žaidimų konsolių emuliavimo programinė įranga, skirta „Linux“. „Emuliacija“ yra programinės įrangos suderina...