C ++

Preťaženie v C ++

Preťaženie v C ++
C ++ neumožňuje funkcii, ktorá pridá dve celé čísla a vráti celé číslo, pridať dva plaváky a vrátiť plavák. Predstavte si, že existuje funkcia na pridanie dvoch celých čísel a na vrátenie celého čísla. Nebolo by pekné mať inú funkciu s rovnakým názvom, ktorá pridáva dva alebo dokonca viac plavákov na vrátenie plaváka? Hovorí sa o tom, že je to preťaženie prvej funkcie.

Aritmetické operátory sa zvyčajne používajú na aritmetické operácie. Nie je pekné mať +, spojiť dva reťazce? Povolenie sa hovorí, že preťažuje operátor aritmetického sčítania pre reťazce.

Operátor prírastku ++ pridá 1 k int alebo float. Pri práci s ukazovateľmi nepridáva k ukazovateľu 1. Ukazuje ukazovateľ na nasledujúci po sebe idúci objekt v pamäti. Iterátor ukazuje na nasledujúci objekt v prepojenom zozname, ale objekty prepojeného zoznamu sú na rôznych miestach v pamäti (nie v po sebe nasledujúcich oblastiach). Nebolo by pekné preťažiť operátor prírastku pre iterátor, zvýšiť, ale ukázať na nasledujúci prvok v zozname prepojených odkazov?

Tento článok vysvetľuje preťaženie v C++. Je rozdelená na dve časti: preťaženie funkcií a preťaženie operátora. Mať už základné vedomosti v C ++ je nevyhnutné na pochopenie zvyšku článku.

Obsah článku

Funkčné preťaženie

Nasledujúca funkcia pridá dva ints a vráti int:

int add (int no1, int no2)

int suma = no1 + no2;
návratná suma;

Prototyp tejto funkcie je:
int add (int no1, int no2);
Prototyp funkcie v hlavičke funkcie končiaci bodkočiarkou. Nasledujúca funkcia s rovnakým názvom, ale s iným prototypom, by pridala tri plaváky a vrátila plavák:
float add (float no1, float no2, float no3)

float sum = no1 + no2 + no3;
návratná suma;

Ako kompilátor rozlišuje, ktorú funkciu má volať, pretože dve alebo viac funkcií má rovnaký názov? Kompilátor používa počet argumentov a typov argumentov na určenie, ktorá funkcia sa má volať. Zoznam parametrov preťažených funkcií by sa mal líšiť počtom a / alebo typmi parametrov. Takže, volanie funkcie,

int sm = pridať (2, 3);

by volal celočíselnú funkciu, zatiaľ čo volanie funkcie,

float sme = pridať (2.3, 3.4, 2.0);

by volal funkciu float. Poznámka: Existujú situácie, keď kompilátor odmietne preťaženú funkciu, keď je počet argumentov rovnaký, ale rôznych typov! - Dôvod: - pozri neskôr.

Nasledujúci program uvádza vyššie uvedené segmenty kódu do činnosti:

#include
pomocou namespace std;
int add (int no1, int no2)

int suma = no1 + no2;
návratná suma;

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

float sum = no1 + no2 + no3;
návratná suma;

int main ()

int sm = pridať (2, 3);
cout<float sme = pridať (2.3, 3.4, 2.0);
cout<návrat 0;

Výstup je:
5
7.7

Preťaženie operátora

Aritmetické operátory sa používajú na preťaženie operácií v typoch tried. Iterátor je typ triedy. Operátory prírastku a zníženia sa používajú na preťaženie operácií iterátora.

Príklad preťaženia operátora triedy reťazca

Táto časť poskytuje príklad, kde je + preťažené pre jednoducho navrhnutú triedu reťazcov, ktorá sa nazýva jarná trieda. + zreťazí literály dvoch reťazcových objektov a vráti nový objekt so zreťazenými literálmi. Zreťazenie dvoch literálov znamená spojiť druhý literál s koncom prvého literálu.

C ++ má teraz pre všetky triedy špeciálnu členskú funkciu, ktorá sa nazýva operátor. Programátor môže túto špeciálnu funkciu použiť na preťaženie operátorov, ako sú napr +. Nasledujúci program zobrazuje preťaženie operátora + pre dva reťazce.

#include
pomocou namespace std;
trieda jar

verejné:
// dátoví členovia
char val [100];
int n;
char concat [100];
// členské funkcie
pružina (char arr [])

pre (int i = 0; i<100; ++i)
val [i] = arr [i];
if (arr [i] == '\ 0')
prestávka;

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

operátor pružiny + (pružina a st)
int novýLen = n + st.n;
char newStr [newLen + 1];
pre (int i = 0; ipre (int i = n; inewStr [newLen] = '\ 0';
jar obj (newStr);
návrat obj;

;
int main ()

char ch1 [] = "Nenávidím ťa! "; pružina str1 (ch1);
char ch2 [] = "Ale ona ťa miluje!"; pružina str2 (ch2);
char ch3 [] = "jeden"; pružina str3 (ch3);
str3 = str1 + str2;
cout<návrat 0;

Hodnota str1 je „Nenávidím ťa! „. Hodnota str2 je „Ale miluje ťa!„. Hodnota str3, ktorá je, str1 + str2, je výstup:

"Nenávidím ťa! Ale ona ťa miluje!„

čo je zreťazenie dvoch reťazcových literálov. Samotné reťazce sú inštancované objekty.

Definícia funkcie operátora je v opise (definícii) triedy reťazca. Začína sa návratovým typom „pružina“ pre „reťazec“. Špeciálny názov „operátor, postupujte podľa tohto“. Potom je tu symbol operátora (má byť preťažený). Potom existuje zoznam parametrov, ktorý je v skutočnosti zoznamom operandov. + je binárny operátor: to znamená, že zaberá ľavý a pravý operand. Avšak podľa špecifikácie C ++ má tu zoznam parametrov iba správny parameter. Potom existuje telo funkcie operátora, ktoré napodobňuje bežné správanie operátora.

Podľa špecifikácie C ++ má definícia operátora + iba pravý parameter operandu, pretože zvyšok popisu triedy je parameter ľavého operandu.

Vo vyššie uvedenom kóde sa preťaženiu + týka iba definícia funkcie operátora + (). Zvyšok kódu pre triedu je bežné kódovanie. V tejto definícii sú dva reťazcové literály zreťazené do poľa newStr []. Potom sa skutočne vytvorí (vytvorí inštancia) nový objekt reťazca pomocou argumentu newStr []. Na konci definície funkcie operator + () sa vráti novovytvorený objekt so zreťazeným reťazcom.

Vo funkcii main () sa pridanie vykonáva pomocou príkazu:

str3 = str1 + str2;

Kde str1, str2 a str3 sú reťazcové objekty, ktoré už boli vytvorené v main (). Výraz „str1 + str2“ s jeho + volá funkciu člena operátora + () v objekte str1. Členská funkcia operator + () v objekte str1 používa ako argument str2 a vráti nový objekt s (vyvinutým) zreťazeným reťazcom. Operátor priradenia (=) úplného príkazu nahradí obsah (hodnoty premenných) objektu str3 obsahom vráteného objektu. Vo funkcii main () po pridaní hodnota údajového člena str3.val už nie je „jeden“; je to zreťazený (prídavný) reťazec: „Nenávidím vás! Ale ona ťa miluje!„. Členská funkcia operator + () v objekte str1 používa reťazcový literál vlastného objektu a reťazcový literál svojho argumentu str2 na vytvorenie spojeného reťazcového literálu.

Preťaženie operátora Iterator

Pri práci s iterátorom sú zapojené najmenej dva objekty: prepojený zoznam a samotný iterátor. V skutočnosti sú to minimálne dve triedy: trieda, z ktorej je inštancovaný prepojený zoznam, a trieda, z ktorej je inštančný iterátor.

Prepojený zoznam

Diagram pre objekt s dvojnásobne prepojeným zoznamom je:

Tento zoznam má tri prvky, ale môže ich byť viac. Tieto tri prvky sú prvkami celých čísel. Prvý z nich má hodnotu 14; ďalší má hodnotu 88; a posledný má hodnotu 47. Každý prvok sa tu skladá z troch po sebe nasledujúcich miest.

To sa nepodobá na pole, kde každý prvok je na jednom mieste a všetky prvky poľa sú na po sebe nasledujúcich miestach. Tu sa rôzne prvky nachádzajú na rôznych miestach v pamäťovej sérii, ale každý prvok pozostáva z troch po sebe nasledujúcich miest.

Pre každý prvok má hodnotu stredné umiestnenie. Správne umiestnenie má ukazovateľ na nasledujúci prvok. Ľavé umiestnenie má ukazovateľ na predchádzajúci prvok. V prípade posledného prvku smeruje správne umiestnenie na teoretický koniec zoznamu. U prvého prvku ukazuje ľavé umiestnenie na teoretický začiatok zoznamu.

S poľom, operátor prírastku (++), zvyšuje ukazovateľ tak, aby ukazoval na fyzicky nasledujúce miesto. V zozname nie sú prvky v pamäti za sebou nasledujúcimi oblasťami. Takže operátor prírastku môže byť preťažený, presunúť iterátor (ukazovateľ) z jedného prvku na logicky ďalší prvok. Rovnaká projekcia platí pre operátor dekrementácie (-).

Dopredný iterátor je iterátor, ktorý keď je v zábere, smeruje na ďalší prvok. Reverzný iterátor je iterátor, ktorý pri zapojení ukazuje na predchádzajúci prvok.

Preťaženie ++ reklamy -

Preťaženie týchto operátorov sa vykonáva v popise (definícii) triedy iterátora.

Syntax pre prototyp preťaženia operátora prírastku, prefix, je

Operátor ReturnType ++ ();

Syntax pre prototyp preťaženia operátora prírastku, postfix, je

Operátor ReturnType ++ (int);

Syntax pre prototyp preťaženia operátora dekrementácie, prefix, je

Operátor ReturnType - ();

Syntax pre prototyp preťaženia operátora prírastku, postfix, je

Operátor ReturnType - (int);

Záver

Preťaženie znamená dať iný význam funkcii alebo operátorovi. V rovnakom rozsahu sú preťažené funkcie. Čo rozlišuje preťažené funkcie, je počet a / alebo typy parametrov v ich zoznamoch parametrov. V niektorých prípadoch, keď je počet parametrov rovnaký, ale s rôznymi typmi, kompilátor odmietne preťaženie - pozri ďalej. Veľa bežných operátorov môže byť preťažených v triedach, z ktorých sú inštanované objekty. To sa deje tak, že sa v popise triedy zadá návratový typ, zoznam parametrov a telo špeciálnej funkcii s názvom operator.

Top 5 ergonomických produktov pre počítačové myši pre Linux
Spôsobuje dlhodobé používanie počítača bolesť zápästia alebo prstov? Trpíte stuhnutými kĺbmi a neustále si musíte podávať ruky? Cítite pálivú bolesť z...
Ako zmeniť nastavenie myši a touchpadu pomocou systému Xinput v systéme Linux
Väčšina distribúcií systému Linux sa štandardne dodáva s knižnicou „libinput“ na spracovanie vstupných udalostí v systéme. Dokáže spracovať vstupné ud...
S ovládaním pomocou myši X-Mouse môžete tlačidlá myši premapovať odlišne pre iný softvér
Možno budete potrebovať nástroj, ktorý by mohol zmeniť ovládanie myši pri každej aplikácii, ktorú používate. Ak je to váš prípad, môžete vyskúšať apli...