C ++

Overbelastning i C ++

Overbelastning i C ++
C ++ tillader ikke en funktion, der tilføjer to heltal og returnerer et heltal, for at tilføje to floats og returnere en float. Forestil dig, at der er en funktion til at tilføje to heltal og returnere et heltal. Ville det ikke være rart at have en anden funktion med samme navn, der tilføjer, men to eller endda flere floats for at returnere en float? At gøre det siges at være, at overbelaste den første funktion.

Aritmetiske operatorer bruges typisk til aritmetiske operationer. Er det ikke rart at have +, slutte sig til to strenge? Aktivering der siges at overbelaste den aritmetiske additionsoperator for strenge.

Inkrementoperatoren ++ tilføjer 1 til et int eller en float. Når det drejer sig om markører, føjer det ikke 1 til markøren. Det får markøren til at pege på det næste fortløbende objekt i hukommelsen. En iterator peger på det næste objekt i en sammenkædet liste, men de tilknyttede listeobjekter findes forskellige steder i hukommelsen (ikke i på hinanden følgende regioner). Ville det ikke være rart at overbelaste inkrementoperatøren for en iterator, at inkrementere, men pege på følgende element i den linkede liste?

Denne artikel forklarer overbelastning i C++. Den er opdelt i to dele: funktionsoverbelastning og operatøroverbelastning. At have allerede grundlæggende viden i C ++ er nødvendig for at forstå resten af ​​artiklen.

Artikelindhold

Funktion Overbelastning

Følgende funktion tilføjer to ints og returnerer et int:

int tilføj (int no1, int no2)

int sum = no1 + no2;
returbeløb

Prototypen for denne funktion er:
int tilføj (int no1, int no2);
Prototypen for en funktion i funktionens overskrift, der slutter med et semikolon. Den følgende funktion med samme navn, men med en anden prototype, tilføjer tre floats og returnerer en float:
float add (float no1, float no2, float no3)

float sum = no1 + no2 + no3;
returbeløb

Hvordan adskiller kompilatoren, hvilken funktion der skal ringes op, da to eller flere funktioner har samme navn? Compileren bruger antallet af argumenter og argumenttyper til at bestemme, hvilken funktion der skal kaldes. Parameterlisten over overbelastede funktioner skal variere i antal og / eller parametertyper. Så funktionskaldet,

int sm = tilføj (2, 3);

ville kalde heltalets funktion, mens funktionen kalde,

flyde sme = tilføj (2.3, 3.4, 2.0);

vil kalde flydefunktionen. Bemærk: der er situationer, hvor compileren afviser en overbelastet funktion, når antallet af argumenter er det samme, men af ​​forskellige typer! - Årsag: - se senere.

Følgende program omsætter ovenstående kodesegmenter til handling:

#omfatte
ved hjælp af namespace std;
int tilføj (int no1, int no2)

int sum = no1 + no2;
returbeløb

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

float sum = no1 + no2 + no3;
returbeløb

int main ()

int sm = tilføj (2, 3);
cout<flyde sme = tilføj (2.3, 3.4, 2.0);
cout<returnere 0;

Outputtet er:
5
7.7

Operatør Overbelastning

Aritmetiske operatorer bruges til at overbelaste operationer i klassetyper. En iterator er en klassetype. Inkrement- og decrementoperatorerne bruges til at overbelaste operationer for en iterator.

Eksempel Overbelastning af strengklasseoperatør

Dette afsnit giver et eksempel, hvor + er overbelastet for en enkelt designet strengklasse, kaldet en fjederklasse. + sammenkæder bogstaverne for to strengobjekter, returnerer et nyt objekt med de sammenkædede bogstaver. Sammenkædning af to bogstaver betyder at slutte sig til den anden bogstavelige til slutningen af ​​den første bogstavelige.

Nu har C ++ en speciel medlemsfunktion til alle klasser, kaldet operatøren. Programmøren kan bruge denne specielle funktion til at overbelaste operatører, f.eks +. Følgende program viser overbelastningen af ​​+ -operatøren for to strenge.

#omfatte
ved hjælp af namespace std;
klasse forår

offentlig:
// datamedlemmer
char val [100];
int n;
char concat [100];
// medlemsfunktioner
forår (char arr [])

for (int i = 0; i<100; ++i)
val [i] = arr [i];
hvis (arr [i] == '\ 0')
pause;

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

fjederoperatør + (fjeder & st)
int newLen = n + st.n;
char newStr [newLen + 1];
for (int i = 0; ifor (int i = n; inewStr [newLen] = '\ 0';
spring obj (newStr);
returnere obj;

;
int main ()

char ch1 [] = "Jeg hader dig! "; fjederstr1 (ch1);
char ch2 [] = "Men hun elsker dig!"; fjederstr2 (ch2);
char ch3 [] = "en"; fjeder str3 (ch3);
str3 = str1 + str2;
cout<returnere 0;

Værdien af ​​str1 er "Jeg hader dig! ". Værdien af ​​str2 er "Men hun elsker dig!". Værdien af ​​str3, som er str1 + str2, er output:

"Jeg hader dig! Men hun elsker dig!"

som er sammenkædningen af ​​de to strenglitteraturer. Strengene selv er instantierede objekter.

Definitionen af ​​operatorfunktionen er inde i beskrivelsen (definition) af strengklassen. Det begynder med returtypen "fjeder" for "streng". Det specielle navn, "operatør, følg dette". Derefter er der symbolet på operatøren (skal overbelastes). Så er der parameterlisten, som faktisk er operandlisten. + er en binær operatør: hvilket betyder, at det tager en venstre og en højre operand. I henhold til C ++ -specifikationen har parameterlisten her kun den rigtige parameter. Så er der operatørfunktionens krop, som efterligner den almindelige operatørs adfærd.

Efter C ++ -specifikationen tager + operator-definitionen kun den rigtige operandparameter, fordi resten af ​​klassebeskrivelsen er den venstre operandparameter.

I ovenstående kode er det kun operator + () -funktionsdefinitionen, der beskæftiger sig med + overbelastningen. Resten af ​​koden til klassen er normal kodning. Inde i denne definition er de to strenglitteraturer sammenkædet i arrayet, newStr []. Derefter oprettes et nyt strengobjekt (instantieres) ved hjælp af et argument, newStr []. I slutningen af ​​operator + () -funktionsdefinitionen returneres det nyoprettede objekt med den sammenkædede streng.

I hovedfunktionen () udføres tilføjelsen af ​​udsagnet:

str3 = str1 + str2;

Hvor str1, str2 og str3 er strengobjekter, der allerede er oprettet i main (). Udtrykket "str1 + str2" med dets + kalder operatorfunktionen + () medlemsfunktion i str1-objektet. Operatør + () medlemsfunktion i str1-objektet bruger str2 som argument og returnerer det nye objekt med (udviklet) den sammenkædede streng. Tildelingsoperatoren (=) for den komplette sætning erstatter indholdet (værdier af variabler) for str3-objektet med de for det returnerede objekt. I hovedfunktionen (), efter tilføjelsen, værdien af ​​datalementet str3.val er ikke længere "en"; det er den sammenkædede streng (tilføjelse), "Jeg hader dig! Men hun elsker dig!". Operatør + () medlemsfunktion i str1-objektet bruger sit eget objekts strenge bogstavelige og strengen bogstavelig i dets argument str2 til at komme op med en sammenføjet streng bogstavelig.

Overbelastning af operatøroperatør

Når det drejer sig om iteratoren, er mindst to objekter involveret: en sammenkædet liste og selve iteratoren. Faktisk er mindst to klasser involveret: en klasse, hvorfra en sammenkædet liste er instantieret, og en klasse, hvorfra en iterator er instantieret.

Linket-liste

Et diagram for et dobbelt-linket objekt er:

Denne liste har tre elementer, men der kan være flere. De tre elementer her er elementer af heltal. Den første har værdien 14; den næste har værdien 88; og den sidste har værdien, 47. Hvert element her består af tre på hinanden følgende placeringer.

Dette er i modsætning til arrayet, hvor hvert element er ét sted, og alle arrayelementerne er på hinanden følgende placeringer. Her er de forskellige elementer forskellige steder i hukommelsesserien, men hvert element består af tre på hinanden følgende placeringer.

For hvert element indeholder den midterste placering værdien. Den rigtige placering har markøren til det næste element. Den venstre placering har markøren til det forrige element. For det sidste element peger den rigtige placering til en teoretisk afslutning på listen. For det første element peger den venstre placering til en teoretisk start af listen.

Med arrayet inkrementerer operatoren (++), markøren for at pege på den fysisk næste placering. På listen findes elementerne ikke i hukommelsesregioner i træk. Så stigningsoperatoren kan overbelastes, flyt iteratoren (markøren) fra et element til det logisk næste element. Den samme fremspring gælder for reduktionsoperatøren (-).

En forward iterator er en iterator, der peger på det næste element, når den er engageret. En omvendt iterator er en iterator, der peger på det forrige element, når den er engageret.

Overbelastning ++ annonce -

Overbelastning af disse operatører sker i iteratorens klassebeskrivelse (definition).

Syntaksen for prototypen på forøgelsesoperatørens overbelastning, præfiks, er

ReturnType-operatør ++ ();

Syntaksen for prototypen for overbelastning af forøgelsesoperatøren, postfix, er

ReturnType-operatør ++ (int);

Syntaksen for prototypen for overbelastning af decrementoperatøren er

ReturnType-operatør - ();

Syntaksen for prototypen for overbelastning af forøgelsesoperatøren, postfix, er

ReturnType-operatør - (int);

Konklusion

Overbelastning betyder at give en funktion eller en operatør en anden betydning. Funktioner er overbelastet i samme omfang. Hvad der skelner mellem overbelastede funktioner er antallet og / eller typerne af parametre i deres parameterlister. I nogle tilfælde, hvor antallet af parametre er det samme, men med forskellige typer, afviser compileren overbelastningen - se senere. Mange almindelige operatører kan overbelastes i klasser, hvorfra objekter instantieres. Dette gøres ved at give en returtype, parameterliste og brødtekst til den specielle funktion navngivet operator i klassebeskrivelsen.

Top 5 spiloptagelseskort
Vi har alle set og elsket streaming af gameplay på YouTube. PewDiePie, Jakesepticye og Markiplier er kun nogle af de bedste spillere, der har tjent mi...
Sådan udvikler du et spil på Linux
For et årti siden ville ikke mange Linux-brugere forudsige, at deres foretrukne operativsystem en dag ville være en populær spilplatform til kommercie...
Open Source-porte med kommercielle spilmotorer
Gratis, open source og cross-platform spilmotorgendringer kan bruges til at spille gamle såvel som nogle af de temmelig nylige spiltitler. Denne artik...