Ц ++

Преоптерећење у Ц ++

Преоптерећење у Ц ++
Ц ++ не дозвољава функцији која додаје две целобројне вредности и враћа цели број, да дода два пловка и врати флоат. Замислите да постоји функција за додавање две целобројне вредности и враћање целог броја. Зар не би било лепо имати другу функцију са истим именом, која додаје, али два или чак више пловака за враћање пловка? Каже се да је то преоптерећење прве функције.

Аритметички оператори се обично користе за аритметичке операције. Зар није лепо имати +, спојите две жице? Омогућавање за које се каже да преоптерећује оператер аритметичког сабирања за низове.

Оператор прираста, ++ додаје 1 у инт или флоат. Када се ради са показивачима, он не додаје 1 показивачу. Усмерава показивач на следећи узастопни објекат у меморији. Итератор показује на следећи објекат на повезаној листи, али се објекти повезане листе налазе на различитим местима у меморији (не у узастопним регионима). Да ли не би било лепо преоптеретити оператор прираштаја за итератор, за повећање, али указати на следећи елемент, на повезаној листи?

Овај чланак објашњава преоптерећење у језику Ц++. Подељен је на два дела: преоптерећење функције и преоптерећење оператера. Поседовање основног знања из језика Ц ++ неопходно је да би се разумео остатак чланка.

Садржај чланка

Преоптерећење функције

Следећа функција додаје два инта и враћа инт:

инт додај (инт бр1, инт бр2)

инт сум = но1 + но2;
повратна сума;

Прототип ове функције је:
инт додати (инт бр1, инт бр2);
Прототип функције у заглављу функције, која се завршава тачком и зарезом. Следећа функција са истим именом, али са другачијим прототипом, додала би три пловка и вратила пловак:
флоат адд (флоат но1, флоат но2, флоат но3)

плутајућа сума = но1 + но2 + но3;
повратна сума;

Како компајлер разликује коју функцију да позове, будући да две или више функција имају исто име? Компајлер користи број аргумената и типове аргумената да одреди коју функцију ће позвати. Листа параметара преоптерећених функција треба да се разликује по њиховом броју и / или типу параметара. Дакле, позив функције,

инт см = додај (2,3);

би позвао целобројну функцију, док функција позива,

флоат сме = додај (2.3, 3.4, 2.0);

би позвао функцију флоат. Напомена: постоје ситуације када ће компајлер одбити преоптерећену функцију када је број аргумената исти, али различитих типова! - Разлог: - видети касније.

Следећи програм спроводи горе наведене сегменте кода у акцију:

#инцлуде
коришћење простора имена стд;
инт додај (инт бр1, инт бр2)

инт сум = но1 + но2;
повратна сума;

флоат адд (флоат но1, флоат но2, флоат но3)

плутајућа сума = но1 + но2 + но3;
повратна сума;

инт маин ()

инт см = додај (2,3);
цоут<флоат сме = додај (2.3, 3.4, 2.0);
цоут<ретурн 0;

Излаз је:
5
7.7

Преоптерећење оператера

Аритметички оператори се користе за преоптерећење операција у типовима класа. Итератор је тип класе. Оператори прираста и смањења користе се за преоптерећење операција за итератор.

Пример преоптерећења оператора класе низова

Овај одељак пружа пример, где је + преоптерећено за једноставно дизајнирану класу низова, која се назива пролећна класа. + спаја литерале два стринг објекта, враћајући нови објект са повезаним литералима. Спајање два литерала значи спајање другог литерала на крај првог литерала.

Сада Ц ++ има посебну функцију члана за све класе, која се назива оператор. Програмер може користити ову посебну функцију за преоптерећење оператора, као што је +. Следећи програм приказује преоптерећење + оператора за две жице.

#инцлуде
коришћење простора имена стд;
разред пролеће

јавно:
// чланови података
цхар вал [100];
инт н;
цхар цонцат [100];
// функције члана
опруга (цхар арр [])

за (инт и = 0; и<100; ++i)
вал [и] = арр [и];
ако (арр [и] == '\ 0')
пауза;

инт и;
за (и = 0; и<100; ++i) if (arr[i] == '\0') break;
н = и;

оператер опруге + (опруга & ст)
инт невЛен = н + ст.н;
цхар невСтр [невЛен + 1];
за (инт и = 0; иза (инт и = н; иневСтр [невЛен] = '\ 0';
спринг обј (невСтр);
ретурн обј;

;
инт маин ()

цхар цх1 [] = "Мрзим те! "; опруга стр1 (цх1);
цхар цх2 [] = "Али она те воли!"; опруга стр2 (цх2);
цхар цх3 [] = "један"; опруга стр3 (цх3);
стр3 = стр1 + стр2;
цоут<ретурн 0;

Вредност стр1 је „Мрзим те! ". Вредност стр2 је „Али она те воли!". Вредност стр3, која је, стр1 + стр2, је излаз:

"Мрзим те! Али она те воли!"

што је спајање два низа литерала. Сами низови су инстанцирани објекти.

Дефиниција функције оператора налази се унутар описа (дефиниције) класе стринга. Почиње типом повратка, "опруга" за "низ". Посебно име, „оператер, прати ово“. Након тога следи симбол оператора (који треба преоптеретити). Затим постоји листа параметара, која је заправо листа операнда. + је бинарни оператор: што значи да је потребан леви и десни операнд. Међутим, према спецификацији Ц ++, листа параметара овде има само прави параметар. Затим је тело функције оператора, које опонаша уобичајено понашање оператера.

Према спецификацији Ц ++, дефиниција оператора + узима само десни параметар операнда, јер је остатак описа класе параметар левог операнда.

У горњем коду, само је дефиниција функције + () забринута за + преоптерећење. Остатак кода за класу је нормално кодирање. Унутар ове дефиниције, два стринг литерала су повезана у низ, невСтр []. Након тога се уствари креира (инстанцира) нови објект низа, користећи аргумент, невСтр []. На крају дефиниције функције оператор + (), враћа се новостворени објекат, који има спојени низ.

У функцији маин () додавање се врши изјавом:

стр3 = стр1 + стр2;

Где су стр1, стр2 и стр3 стринг објекти који су већ створени у маин (). Израз, „стр1 + стр2“ са својим +, позива функцију члана оператора + () у објекту стр1. Функција члана оператора + () у објекту стр1 користи стр2 као свој аргумент и враћа нови објекат са (развијеним) спојеним низом. Оператор доделе (=) комплетног израза, замењује садржај (вредности променљивих) објекта стр3, онима враћеног објекта. У функцији маин (), након додавања, вредност члана података стр3.вал више није „један“; то је уједињени (сабирни) низ, „Мрзим те! Али она те воли!". Функција члана оператора + () у објекту стр1 користи литерал низа сопственог објекта и литерал низа свог аргумента стр2 како би смислила удружени литерал низа.

Преоптерећење оператора итератора

Када се ради са итератором, укључена су најмање два објекта: повезана листа и сам итератор. У ствари су укључене најмање две класе: класа из које је инстанцирана везана листа и класа из које је инстанциран итератор.

Повезана листа

Дијаграм за објект двоструко повезане листе је:

Ова листа има три елемента, али може бити и више. Три елемента овде су елементи целих бројева. Прва има вредност 14; следећи има вредност, 88; а последњи има вредност, 47. Сваки елемент овде се састоји од три узастопна места.

Ово је за разлику од низа, где је сваки елемент једно место, а сви елементи низа су на узастопним локацијама. Овде се различити елементи налазе на различитим местима у меморијској серији, али сваки елемент се састоји од три узастопна места.

За сваки елемент вредност има средња локација. Права локација има показивач на следећи елемент. Лева локација има показивач на претходни елемент. За последњи елемент, права локација указује на теоретски крај листе. За први елемент, лева локација показује на теоретски почетак листе.

Помоћу низа, оператор прираста (++), повећава показивач да би указао на физички следећу локацију. Са листом, елементи се не налазе у узастопним регионима у меморији. Дакле, оператор прираста може бити преоптерећен, померите итератор (показивач) из једног елемента у логички следећи елемент. Иста пројекција односи се на оператор декремента (-).

Напредни итератор је итератор који када је ангажован показује на следећи елемент. Обрнути итератор је итератор који када је ангажован показује на претходни елемент.

Преоптерећење ++ огласа -

Преоптерећење ових оператора врши се у опису класе (дефиницији) итератора.

Синтакса за прототип преоптерећења оператора прираста, префикс, је

Оператор РетурнТипе ++ ();

Синтакса за прототип преоптерећења оператора прираста, постфик, је

Оператор РетурнТипе ++ (инт);

Синтакса за прототип преоптерећења оператора декремента, префикс, је

Оператор РетурнТипе - ();

Синтакса за прототип преоптерећења оператора прираста, постфик, је

Оператор РетурнТипе - (инт);

Закључак

Преоптерећење значи давање функције или оператора различитом значењу. Функције су преоптерећене у истом опсегу. Оно што разликује преоптерећене функције су број и / или типови параметара на њиховим листама параметара. У неким случајевима, када је број параметара једнак, али код различитих типова, компајлер одбацује преоптерећење - погледајте касније. Многи уобичајени оператори могу бити преоптерећени у класама из којих се инстанцирају објекти. То се постиже давањем посебне функције, именоване оператор, у опису класе, повратном типу, листи параметара и телу.

Топ 5 карата за хватање игара
Сви смо видели и волели стримовање играња на ИоуТубе-у. ПевДиеПие, Јакесептицие и Маркиплиер само су неки од најбољих играча који су зарадили милионе ...
Како развити игру на Линуку
Пре деценију, није много корисника Линука предвидело да ће њихов омиљени оперативни систем једног дана бити популарна платформа за играње комерцијални...
Портови комерцијалних игара отвореног кода
Бесплатне рекреације покретачких игара са отвореним кодом и више платформи могу се користити за играње старих, као и неких прилично недавних наслова и...