Ця стаття містить , але походження тверджень у ній через практично повну відсутність . |
Перевантаження операторів — в програмуванні один із засобів реалізації поліморфізму (спеціалізований поліморфізм), що полягає в можливості одночасного існування в одній зоні видимості декількох різних варіантів застосування операторів, що мають одне й те саме ім'я, але різні типи аргументів, до яких вони застосовуються.
Вступ
В кожній предметній області існують свої стандартні позначення, що полегшують наведення і обговорення концепцій, що часто зустрічаються. Наприклад, завдяки постійному використанню вираз
x+y*z
є зрозумілішим, ніж фраза
помножити y на z і додати результат до x
або навіть
add (x, multiply (y,z))
Перевантаження операторів — це синтаксичний цукор для короткої і виразної форми запису типових операцій.
Приклад
#include <stdio.h> // для printf class X { int x; public: X() : x(0) {} explicit X(int i) : x(i) {} operator int() { return x; } X& operator=(const X& arg1) { x = arg1.x; return *this; } friend const X operator+(const X&, const X&); friend const X operator*(const X&, const X&); }; // використання дружніх функцій дозволяє доступ до приватних членів класу // і також дозволяє показати симетричність в оголошенні функції. // застосування модифікатора const до значення, яке повертається, перешкоджає // написанню дивних виразів подібних до X(5) + X(6) = X(7) inline const X operator+(const X& arg1, const X& arg2) { X r; r.x = arg1.x + arg2.x; return r; } inline const X operator*(const X& arg1, const X& arg2) { X r; r.x = arg1.x * arg2.x; return r; } int main() { X x; x = X(5) + X(6) * X(7); // = 47 ( * має вищий пріоритет ) // x = 5 + 6 * 7; - не спрацює через використання explicit, // а x = X(5 + 6 * 7); можна printf("%d\n", x); // завдяки operator int() х неявно перетворюється в int }
Критика та експертний аналіз явища
Перевантаження операторів часто підпадає під критику через те, що воно дозволяє надавати операторам зовсім різну семантику в залежності від типу їх операндів. Наприклад, використання <<
в :
a << 1
зсуває біти в змінній a ліворуч на 1 біт, якщо a належить до цілочисельного типу, але якщо a це потік виведення, тоді такий код буде намагатися вивести "1" в потік. Через те, що перевантаження операторів дозволяє програмісту, що почав писати код програми, змінити семантику операторів, то інші розробники, що будуть працювати далі на кодом, можуть зіткнутись із неочікуваною поведінкою операторів. Тож вважається доброю практикою з обережністю ставитися до перевантаження операторів.
Поширена відповідь на цю критику програмістів, які надають перевагу перевантаженню операторів, полягає у тому, що те саме можна сказати і про перевантаження функцій. Далі більше — навіть без можливості перевантаження програміст може написати функцію, яка буде робити зовсім не те, що від неї можна очікувати, беручи до уваги її назву. Крім того, такі мови як С++ обмежують набір операторів для перевантаження, тобто не можна визначити нову лексему оператора.
Інший, більш тонкий момент з операторами такий, що можуть бути очікувані звичайні математичні правила. Наприклад, комутативність операції + (тобто a + b == b + a
) не завжди виконується; наприклад, коли операндами є рядки (тобто результат "свято" + "весна"
відрізняється від "весна" + "свято"
). Типовим зустрічним аргументом, що випливає з математики, є: допоки + комутативний для цілих чисел (і, загалом, для кожного кільця), він не комутативний для інших типів змінних. Можна також зауважити, що на практиці + навіть не є асоціативним для чисел з рухомою комою зважаючи на проблему заокруглювання.
Оператори перевантажуються таким чином, що їхні об'єкти ведуть себе як примітивні типи.
Нюанси з оптимізацією
Також проблемою з точки зору швидкодії є те, що перевантаження операторів не дає ніякої інформації про зв'язки між ними. Наприклад, у випадку беззнакового цілого x
вирази x * 4
, x + x + x + x
та x << 2
еквівалентні, і компілятор може використовувати цю еквівалентність в цілях оптимізації. З іншого боку, якщо x
— це об'єкт деякого гіпотетичного класу Integer
, то ці вирази будуть неминуче інтерпретовані буквально. Візьмемо реальний приклад: матричний вираз A * B + A * C
має потенціал для оптимізації, який не може бути реалізований через точний порядок виконання, що є результатом перевантаження операторів *
та +
.
Класифікація
Класифікація деяких мов програмування за можливістю перевантаження і розширення набору операторів.
Множина операторів | Перевантаження , ні | Перевантаження , так |
---|---|---|
Обмежена | ||
Можливо вводити нові |
Див. також
Примітки
- На початку розвитку мов програмування дана думка преваліювала не у всіх інженерних і наукових колах. Яскравим прикладом є мова COBOL, де синтаксис, що нагадує вирази англійською мовою (на зразок
MULTIPLY Y BY Z GIVING Q
), покладено у саму основу мови.
Джерела
- Б'ярне Страуструп (2013). The C++ Programming Language (вид. 4). Addison-Wesley. ISBN .(англ.)
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cya stattya mistit perelik posilan ale pohodzhennya tverdzhen u nij zalishayetsya nezrozumilim cherez praktichno povnu vidsutnist vnutrishnotekstovih dzherel vinosok Bud laska dopomozhit polipshiti cyu stattyu peretvorivshi dzherela z pereliku posilan na dzherela vinoski u samomu teksti statti Perevantazhennya operatoriv v programuvanni odin iz zasobiv realizaciyi polimorfizmu specializovanij polimorfizm sho polyagaye v mozhlivosti odnochasnogo isnuvannya v odnij zoni vidimosti dekilkoh riznih variantiv zastosuvannya operatoriv sho mayut odne j te same im ya ale rizni tipi argumentiv do yakih voni zastosovuyutsya VstupV kozhnij predmetnij oblasti isnuyut svoyi standartni poznachennya sho polegshuyut navedennya i obgovorennya koncepcij sho chasto zustrichayutsya Napriklad zavdyaki postijnomu vikoristannyu viraz x y z ye zrozumilishim nizh fraza pomnozhiti y na z i dodati rezultat do x abo navit add x multiply y z Perevantazhennya operatoriv ce sintaksichnij cukor dlya korotkoyi i viraznoyi formi zapisu tipovih operacij Priklad include lt stdio h gt dlya printf class X int x public X x 0 explicit X int i x i operator int return x X amp operator const X amp arg1 x arg1 x return this friend const X operator const X amp const X amp friend const X operator const X amp const X amp vikoristannya druzhnih funkcij dozvolyaye dostup do privatnih chleniv klasu i takozh dozvolyaye pokazati simetrichnist v ogoloshenni funkciyi zastosuvannya modifikatora const do znachennya yake povertayetsya pereshkodzhaye napisannyu divnih viraziv podibnih do X 5 X 6 X 7 inline const X operator const X amp arg1 const X amp arg2 X r r x arg1 x arg2 x return r inline const X operator const X amp arg1 const X amp arg2 X r r x arg1 x arg2 x return r int main X x x X 5 X 6 X 7 47 maye vishij prioritet x 5 6 7 ne spracyuye cherez vikoristannya explicit a x X 5 6 7 mozhna printf d n x zavdyaki operator int h neyavno peretvoryuyetsya v int Kritika ta ekspertnij analiz yavishaPerevantazhennya operatoriv chasto pidpadaye pid kritiku cherez te sho vono dozvolyaye nadavati operatoram zovsim riznu semantiku v zalezhnosti vid tipu yih operandiv Napriklad vikoristannya lt lt v C a lt lt 1 zsuvaye biti v zminnij a livoruch na 1 bit yaksho a nalezhit do cilochiselnogo tipu ale yaksho a ce potik vivedennya todi takij kod bude namagatisya vivesti 1 v potik Cherez te sho perevantazhennya operatoriv dozvolyaye programistu sho pochav pisati kod programi zminiti semantiku operatoriv to inshi rozrobniki sho budut pracyuvati dali na kodom mozhut zitknutis iz neochikuvanoyu povedinkoyu operatoriv Tozh vvazhayetsya dobroyu praktikoyu z oberezhnistyu stavitisya do perevantazhennya operatoriv Poshirena vidpovid na cyu kritiku programistiv yaki nadayut perevagu perevantazhennyu operatoriv polyagaye u tomu sho te same mozhna skazati i pro perevantazhennya funkcij Dali bilshe navit bez mozhlivosti perevantazhennya programist mozhe napisati funkciyu yaka bude robiti zovsim ne te sho vid neyi mozhna ochikuvati beruchi do uvagi yiyi nazvu Krim togo taki movi yak S obmezhuyut nabir operatoriv dlya perevantazhennya tobto ne mozhna viznachiti novu leksemu operatora Teoriya kilec Inshij bilsh tonkij moment z operatorami takij sho mozhut buti ochikuvani zvichajni matematichni pravila Napriklad komutativnist operaciyi tobto a b b a ne zavzhdi vikonuyetsya napriklad koli operandami ye ryadki tobto rezultat svyato vesna vidriznyayetsya vid vesna svyato Tipovim zustrichnim argumentom sho viplivaye z matematiki ye dopoki komutativnij dlya cilih chisel i zagalom dlya kozhnogo kilcya vin ne komutativnij dlya inshih tipiv zminnih Mozhna takozh zauvazhiti sho na praktici navit ne ye asociativnim dlya chisel z ruhomoyu komoyu zvazhayuchi na problemu zaokruglyuvannya Operatori perevantazhuyutsya takim chinom sho yihni ob yekti vedut sebe yak primitivni tipi Nyuansi z optimizaciyeyu Takozh problemoyu z tochki zoru shvidkodiyi ye te sho perevantazhennya operatoriv ne daye niyakoyi informaciyi pro zv yazki mizh nimi Napriklad u vipadku bezznakovogo cilogo x virazi x 4 x x x x ta x lt lt 2 ekvivalentni i kompilyator mozhe vikoristovuvati cyu ekvivalentnist v cilyah optimizaciyi Z inshogo boku yaksho x ce ob yekt deyakogo gipotetichnogo klasu Integer to ci virazi budut neminuche interpretovani bukvalno Vizmemo realnij priklad matrichnij viraz A B A C maye potencial dlya optimizaciyi yakij ne mozhe buti realizovanij cherez tochnij poryadok vikonannya sho ye rezultatom perevantazhennya operatoriv ta KlasifikaciyaKlasifikaciya deyakih mov programuvannya za mozhlivistyu perevantazhennya i rozshirennya naboru operatoriv Mnozhina operatoriv Perevantazhennya ni Perevantazhennya tak Obmezhena C Java Objective C Pascal PHP BASIC Ada C C Object Pascal Perl Python Rust Mozhlivo vvoditi novi ML LISP dzherelo Fortran Haskell PostgreSQL Prolog Ruby Perl 6 SmalltalkDiv takozhPerevantazhennya funkciyi Pidprograma Operatori v C ta C PrimitkiNa pochatku rozvitku mov programuvannya dana dumka prevaliyuvala ne u vsih inzhenernih i naukovih kolah Yaskravim prikladom ye mova COBOL de sintaksis sho nagaduye virazi anglijskoyu movoyu na zrazok MULTIPLY Y BY Z GIVING Q pokladeno u samu osnovu movi DzherelaB yarne Straustrup 2013 The C Programming Language vid 4 Addison Wesley ISBN 978 0321563842 angl