C ++

Přetížení v C ++

Přetížení v C ++
C ++ neumožňuje funkci, která přidá dvě celá čísla a vrátí celé číslo, přidat dva plováky a vrátit plovák. Představte si, že existuje funkce pro přidání dvou celých čísel a vrácení celého čísla. Nebylo by hezké mít jinou funkci se stejným názvem, která přidá dva nebo dokonce více plováků, které vrátí plovák? Tím se říká, že je to přetížení první funkce.

Aritmetické operátory se obvykle používají pro aritmetické operace. Není hezké mít +, spojit dva řetězce? Povolení, o kterém se říká, že přetíží operátor aritmetického přidání, pro řetězce.

Operátor přírůstku ++ přidá 1 k int nebo float. Při práci s ukazateli nepřidává 1 k ukazateli. Vytvoří ukazatel na následující po sobě jdoucí objekt v paměti. Iterátor ukazuje na další objekt v propojeném seznamu, ale objekty propojeného seznamu jsou v paměti na různých místech (nikoli v po sobě jdoucích oblastech). Nebylo by hezké přetížit operátor přírůstku pro iterátor, zvýšit, ale ukázat na následující prvek v propojeném seznamu?

Tento článek vysvětluje přetížení v C++. Je rozdělena na dvě části: přetížení funkcí a přetížení obsluhy. Mít již základní znalosti v C ++ je nezbytné k pochopení zbytku článku.

Obsah článku

Přetížení funkce

Následující funkce přidá dva ints a vrátí int:

int add (int no1, int no2)

int součet = no1 + no2;
návratná částka;

Prototyp této funkce je:
int add (int no1, int no2);
Prototyp funkce v záhlaví funkce, končící středníkem. Následující funkce se stejným názvem, ale s jiným prototypem, by přidala tři floaty a vrátila float:
float add (float no1, float no2, float no3)

float sum = no1 + no2 + no3;
návratná částka;

Jak kompilátor rozlišuje, kterou funkci má volat, protože dvě nebo více funkcí má stejný název? Kompilátor používá počet argumentů a typů argumentů k určení, která funkce má být volána. Seznam parametrů přetížených funkcí by se měl lišit v jejich počtu a / nebo typech parametrů. Volání funkce,

int sm = přidat (2, 3);

by volala celočíselnou funkci, zatímco by volala funkci,

float sme = přidat (2.3, 3.4, 2.0);

zavolá funkci float. Poznámka: Existují situace, kdy kompilátor odmítne přetíženou funkci, když je počet argumentů stejný, ale různých typů! - Důvod: - viz dále.

Následující program uvádí výše uvedené segmenty kódu do praxe:

#zahrnout
pomocí jmenného prostoru std;
int add (int no1, int no2)

int součet = no1 + no2;
návratná částka;

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

float sum = no1 + no2 + no3;
návratná částka;

int main ()

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

Výstupem je:
5
7.7

Přetížení operátora

Aritmetické operátory se používají k přetížení operací v typech tříd. Iterátor je typ třídy. Přírůstkové a dekrementační operátory se používají k přetížení operací pro iterátor.

Příklad přetížení operátora třídy řetězce

Tato část poskytuje příklad, kde je + přetíženo pro jednoduše navrženou třídu řetězců, která se nazývá třída pružiny. + zřetězí literály dvou řetězcových objektů a vrátí nový objekt se zřetězenými literály. Zřetězení dvou literálů znamená spojení druhého literálu s koncem prvního literálu.

C ++ má nyní speciální členskou funkci pro všechny třídy, která se nazývá operátor. Programátor může tuto speciální funkci použít k přetížení operátorů, jako je +. Následující program ukazuje přetížení operátoru + pro dva řetězce.

#zahrnout
pomocí jmenného prostoru std;
třída jaro

veřejnost:
// datové členy
char val [100];
int n;
char concat [100];
// členské funkce
pružina (char arr [])

pro (int i = 0; i<100; ++i)
val [i] = arr [i];
if (arr [i] == '\ 0')
přestávka;

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

operátor pružiny + (pružina a sv.)
int newLen = n + st.n;
char newStr [newLen + 1];
pro (int i = 0; ipro (int i = n; inewStr [newLen] = '\ 0';
jarní obj (newStr);
návrat obj;

;
int main ()

char ch1 [] = "Nenávidím vás! "; pružina str1 (ch1);
char ch2 [] = "Ale ona tě 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 vás! ". Hodnota str2 je „Ale ona tě miluje!". Hodnota str3, což je str1 + str2, je výstup:

"Nesnáším tě! Ale ona tě miluje!"

což je zřetězení dvou řetězcových literálů. Samotné řetězce jsou instanční objekty.

Definice funkce operátoru je uvnitř popisu (definice) třídy řetězce. Začíná to návratovým typem, „pružina“ pro „řetězec“. Zvláštní název „operátor, následujte toto“. Poté je zde symbol operátora (k přetížení). Pak je tu seznam parametrů, což je vlastně seznam operandů. + je binární operátor: to znamená, že trvá levý a pravý operand. Podle specifikace C ++ však seznam parametrů zde má pouze správný parametr. Pak je tu tělo funkce operátora, které napodobuje běžné chování operátora.

Podle specifikace C ++ definice operátoru + přebírá pouze pravý parametr operandu, protože zbytek popisu třídy je levým parametrem operandu.

Ve výše uvedeném kódu se pouze + definice funkce operátor + () týká přetížení +. Zbytek kódu pro třídu je normální kódování. Uvnitř této definice jsou dva řetězcové literály zřetězeny do pole newStr []. Poté je ve skutečnosti vytvořen (instancován) nový objekt řetězce pomocí argumentu newStr []. Na konci definice funkce operator + () je vrácen nově vytvořený objekt, který má zřetězený řetězec.

Ve funkci main () se přidání provádí příkazem:

str3 = str1 + str2;

Kde str1, str2 a str3 jsou řetězcové objekty, které již byly vytvořeny v main (). Výraz „str1 + str2“ s jeho + volá funkci člena operator + () v objektu str1. Členská funkce operator + () v objektu str1 používá jako argument str2 a vrací nový objekt s (vyvinutým) zřetězeným řetězcem. Operátor přiřazení (=) úplného příkazu nahradí obsah (hodnoty proměnných) objektu str3 obsahem vráceného objektu. Ve funkci main () po přidání hodnota datového člena str3.val již není „jeden“; je to zřetězený (přídavný) řetězec: „Nenávidím vás! Ale ona tě miluje!". Členská funkce operator + () v objektu str1, používá řetězcový literál vlastního objektu a řetězcový literál svého argumentu str2, aby přišel s připojeným řetězcovým literálem.

Přetížení operátora iterátoru

Při práci s iterátorem jsou zahrnuty alespoň dva objekty: propojený seznam a samotný iterátor. Ve skutečnosti jsou zahrnuty alespoň dvě třídy: třída, ze které je vytvořena instance propojeného seznamu, a třída, ze které je vytvořena instance iterátoru.

Spojový seznam

Diagram pro objekt s dvojnásobně propojeným seznamem je:

Tento seznam má tři prvky, ale může jich být více. Tři prvky zde jsou prvky celých čísel. První z nich má hodnotu 14; další má hodnotu 88; a poslední má hodnotu 47. Každý prvek se zde skládá ze tří po sobě jdoucích umístění.

To je na rozdíl od pole, kde každý prvek je jedno místo a všechny prvky pole jsou v po sobě jdoucích umístěních. Zde jsou různé prvky na různých místech v paměťové řadě, ale každý prvek se skládá ze tří po sobě jdoucích umístění.

U každého prvku má střední umístění hodnotu. Správné umístění má ukazatel na další prvek. Levé umístění má ukazatel na předchozí prvek. U posledního prvku ukazuje správné umístění na teoretický konec seznamu. U prvního prvku ukazuje levé umístění na teoretický začátek seznamu.

U pole, operátor přírůstku (++), zvýší ukazatel, aby ukazoval na fyzicky další umístění. Se seznamem nejsou prvky v paměti v po sobě jdoucích oblastech. Operátor přírůstku tedy může být přetížen, přesuňte iterátor (ukazatel) z jednoho prvku na logicky další prvek. Stejná projekce platí pro operátor dekrementace (-).

Dopředný iterátor je iterátor, který při zapojení ukazuje na další prvek. Zpětný iterátor je iterátor, který při zapojení ukazuje na předchozí prvek.

Přetížení ++ reklamy -

Přetížení těchto operátorů se provádí v popisu třídy (definice) iterátoru.

Syntaxe prototypu přetížení operátoru přírůstku, prefix, je

Operátor ReturnType ++ ();

Syntaxe pro prototyp přetížení operátoru přírůstku, postfix, je

Operátor ReturnType ++ (int);

Syntaxe prototypu přetížení operátoru dekrementace, prefix, je

Operátor ReturnType - ();

Syntaxe pro prototyp přetížení operátoru přírůstku, postfix, je

Operátor ReturnType - (int);

Závěr

Přetížení znamená dát jiný význam funkci nebo operátorovi. Funkce jsou přetíženy ve stejném rozsahu. Co rozlišuje přetížené funkce, je počet a / nebo typy parametrů v jejich seznamech parametrů. V některých případech, kde je počet parametrů stejný, ale u různých typů kompilátor odmítne přetížení - viz dále. Mnoho běžných operátorů může být přetíženo ve třídách, ze kterých jsou instance instancí. To se provádí zadáním typu návratu, seznamu parametrů a těla speciální funkci s názvem operátor v popisu třídy.

Hry Top 10 her k hraní na Ubuntu
Top 10 her k hraní na Ubuntu
Platforma Windows byla jednou z dominujících platforem pro hraní her kvůli velkému procentu her, které se dnes vyvíjejí, aby nativně podporovaly Windo...
Hry 5 nejlepších arkádových her pro Linux
5 nejlepších arkádových her pro Linux
V dnešní době jsou počítače vážné stroje používané k hraní her. Pokud nemůžete získat nové vysoké skóre, budete vědět, co tím myslím. V tomto příspěvk...
Hry Battle For Wesnoth 1.13.6 Vývoj uvolněn
Battle For Wesnoth 1.13.6 Vývoj uvolněn
Battle For Wesnoth 1.13.6 vydané minulý měsíc, je šestým vývojovým vydáním v 1.13.série x a přináší řadu vylepšení, zejména do uživatelského rozhraní,...