Să nu vorbim despre evident - să trecem la analiza supraîncărcării. În linia 15, vedem prototipul metodei Overload. void operator + (char *); Această metodă va obliga operatorul + să funcționeze așa cum vom face (așa cum vom defini mai jos). Pentru a supraîncărca un operator, trebuie să utilizați operatorul de cuvinte cheie. În cazul nostru, metoda nu returnează valori, prin urmare, nule. apoi operatorul de cuvinte cheie și operatorul + însuși. Această metodă are un pointer la un șir.
În funcția principală, avem 4 rânduri aleatorii definite. Le afișăm pe ecran (liniile 39 - 42). Mai jos, pe linia 44, este declarat un obiect Joke. În timpul creării sale, constructorul clasei. va șterge elementul clasei str din "gunoi" și va fi gata pentru scrierea șirurilor. Rămâne să se efectueze acțiuni simple (linii 46 - 49) - folosind supraîncărcat + scrieți toate liniile într-un (str) în ordinea corectă.
Totul sa dovedit. De asemenea, după cum se poate observa în rezultat, pentru datele numerice, operatorul + a funcționat corect. Prin urmare, puteți să o aplicați în siguranță pentru operațiile aritmetice din cod - compilatorul vă va "înțelege". Un alt lucru - supraîncărcarea operatorului este eficientă numai în cadrul clasei pentru care este definită. Dacă definim o altă clasă (de ex. Overload2), dar nu supraîncărcați operatorul pentru aceasta, încercând să folosiți + pentru a scrie linia undeva va duce la o eroare.
Există o serie de excepții în C ++ - nu toți operatorii pot fi supraîncărcați. Iată lista:
Și mai multă teorie:
- supraîncărcarea operatorului nu poate schimba prioritatea și ordinea operațiunilor;
- nu există posibilitatea, cu ajutorul suprasolicitării, de a crea noi simboluri pentru operațiuni;
- operatorii binari nu pot fi utilizați pentru a suprascrie funcționarea unară și invers - operatorul unar nu suprascrie operația binară.
Am de gând să scriu un alt articol în viitor despre supraîncărcarea operatorului, unde vreau să arăt prin exemple cum să supraîncărcați ++ increment, decrement, == egalitate, = asignare nouă și ștergere. Aș vrea să nu uit :)
Pentru a sprijini site-ul nostru - faceți clic pe banca de porc și alegeți orice metodă convenabilă.
>> De exemplu, atunci când o acțiune trebuie repetată de mai multe ori în cod și este pur și simplu dureros să folosiți în mod constant funcții speciale pentru aceasta - puteți supraîncărca operatorul pentru acest lucru.
În general, este adevărat, dar supraîncărcarea este o modalitate inteligentă de a te împușca în picior (și încă trage ceva la un prieten). Un lucru foarte periculos. Se poate îmbunătăți atât lizibilitatea codului, cât și orice altceva.
Myers a avut reguli pe această temă (dacă nu le respectați - veți fi nevoiți să păstrați toate cele 7 cercuri în iad). De exemplu:
- operatorul de cesiune trebuie să returneze o trimitere la * this;
- în instrucțiunea de atribuire, efectuați un test de auto-atribuire;
- există un întreg despre supraîncărcarea noilor și ștergerea, dar IMHO 99% dintre muritori nu trebuie să atingă acești operatori;
- Declarați funcții care nu sunt membri atunci când conversia de tip trebuie să fie aplicabilă tuturor parametrilor.
Ei bine, o serie de alte reguli (în mai multe cărți).
Vă sugerez să fiți atenți la ultima regulă din listă. Aveți o declarație pentru care lucrați
Joke + str1;
Dar nu va funcționa
str1 + Joke;
Dar ar fi minunat dacă operatorul ar lucra în ambele direcții. Pentru a face acest lucru, este suficient să nu fie membru al clasei (funcția obișnuită). Nu este deloc dificil, nu-i așa? )