műveletek túlterhelése

műveletek túlterhelése

A C ++, a beállított műveletek felett definiált változók standard típusok, mint a +. -. *. / Stb Minden művelet alkalmazható operandus egy bizonyos típusú.

Sajnos, csak korlátozott számú típusok közvetlenül támogatja semmilyen programozási nyelv. Például, a C és a C ++ nem teszik lehetővé, hogy végre műveleteket komplex számok, tömbök, vonósok, készletek. Azonban mindezen műveleteket lehet véghezvinni osztályok C ++.

Tegyük fel, hogy A és B halmaz:
A = <а1, а2, а3>;
B = ,
és azt akarjuk, hogy végre egy egyesítés művelet (+) és a kereszteződés (*) készletek.

Megadhatjuk egy osztály Set - „sok”, és meghatározza műveletek tárgyakat ennek az osztálynak, kifejező őket útján jelei műveletek, amelyek már a C ++, például +, és a *. Ennek eredményeként a műveletek + és * lehet használni, mint korábban, hanem számukra kiegészítő funkciók (unió és kereszteződés). Hogyan állapítható meg, hogy milyen funkciót kell az üzemeltető által végzett: a régi vagy az új? Nagyon egyszerű - a operandus típusát. És mi a helyzet a kiemelt műveleteket? Ez mentett korábban meghatározott prioritási műveleteket. Ahhoz, hogy meghosszabbítja a műveletet az új típusú adatot kell határozni egy különleges funkció a „működési funkció” (operátor-funkció). A formátum:

Ha szükséges, adhatunk a prototípus:

Ha feltételezzük, hogy az üzemeltető znak_operatsii kialakítása a függvény nevét, a prototípus, és a művelet meghatározása funkciók hasonlóak a prototípus, és a meghatározása a szokásos nyelvi funkciók C ++. A konkrét művelet úgynevezett túlterhelés (túlterhelés).

A túlterhelés egyváltozós függvények

Bármilyen @ egyváltozós művelet lehet meghatározni két módja van: akár a funkció komponens paraméterek nélkül, vagy egy globális (esetleg baráti) függvény egyetlen paramétere. Az első esetben, a kifejezés @ Z jelenti hívó Z.operator @ (). A második - a hívás operátor @ (Z).

Egyoperandusú szereplők, túlterhelt egy bizonyos osztályon belüli átvihetők mindössze egy nem-statikus komponens funkció paraméterek nélkül. Az úgynevezett class objektum automatikusan érzékelik, mint egy operandust.

Egyváltozós függvények osztály mező túlterhelt (például a globális funkciók) kell egy paraméter osztály típusát. Keresztül továbbított paraméter objektum tartják egy operandus.

a) Az első esetben (leírt osztály field):

b) A második esetben (a terület kívül az osztály leírás):

A túlterhelés bináris operátorok

Bármilyen bináris operátor @ lehet meghatározni két módja van: akár a funkció komponens egyetlen paramétert vagy globális (esetleg baráti) függvény két paramétert. Az előbbi esetben, x @ y jelzi a kihívást x.operator @ (y). A második - a hívás operátor @ (x, y).

Műveletek az osztályon belül túlterhelések újraindítani csak nem statikus komponens funkciók paramétereit. Az úgynevezett class objektum automatikusan érzékelik, mint az első operandust.

Műveletek az osztályon kívül túlterhelés területen kell két operandus, amelyek közül az egyik legyen egy osztály típusát.

A túlterhelés műveletek ++ és -.

Egyváltozós függvények növekmény ++ és csökkentő - két formában: prefix és postfix. A jelenlegi specifikáció C ++ meghatározott a módját, ahogyan a fordító tudja megkülönböztetni a két forma között. Összhangban ezzel a módszerrel kapott két változatban szereplő ++ () és operator - (). Ezek meghatározása a következő:

Megjegyzés int opciót postfix forma nem határozza meg a második operandus, és csak akkor kell használni, hogy megkülönböztessük a prefix formában.

Túlterhelés művelet függvényhívás

Ez a művelet '()'. Ez egy művelet. Az első operandus jellemzően egy objektumot, a második - az opciók listája.

hozzárendelés túlterhelés

Működés különbözik három jellemzői:

  • művelet öröklődik;
  • definiált alapértelmezett művelet az egyes osztályokra, mint egy bitenkénti Az objektum másolata állva jobbra a jel művelet az objektum állva a bal oldalon.
  • művelet átvihetők csak az osztály definíciója. Ez biztosítja, hogy mindig lesz az első operandus levodopustimoe kifejezést.

Az egyéni osztály - string karakterlánc:

Mi a hiba itt? Ha s1 s2 objektum van rendelve az objektum. p s2 mutató kifogás pont ugyanaz a memória területen, mint a mutató p objektum s1. Tehát, ha ezek a tárgyak eltávolítása, a memória által mutatott a mutató p objektum s1. megjelent kétszer, de a memória, amelyben a mutató mutat egy megbízást o objektum s2. Ez egyáltalán nem válik szabaddá.

Bár ebben a példában ez a hiba nem veszélyes a valós programok memória dinamikus, ez okozhat összeomlást.

Ebben az esetben a túlterhelés az értékadó operátor. Megmutatjuk, hogyan kell ezt a mi osztály karakterlánc.

Ezután ellenőrizzük, hogy elegendő memória az objektum balra megbízás jelet, egy tárgy áll a jobb a megbízás jel. Ha nem lenne elég, a lefoglalt memória felszabadul, és az új, kívánt méretet. Ezután a húr bemásolja ezt a memóriát.

Túlterhelés művelet új.

Működés új. Az alapértelmezett, lehet két formája van:

Az első forma nem használják tömbök, a második - a tömbök.

Egy túlterhelt új üzemeltető lehet meghatározni a következő formákban, illetve a nem tömbök és tömbök:

Az első és egyetlen kötelező argumentum t kell mindig típusú size_t. Ha az argumentum típusú size_t. A működés során a funkció automatikusan szubsztituált új érv sizeof (t). azaz kap, amelynek értéke eléri az objektum méretét t byte-ban.

Tegyük fel például, a következő függvény meghatározása:

és ez az úgynevezett az alábbiak szerint:

Itt, t = kettős, n = 5.

Ennek eredményeként, a T értéke hívása után a szervezetben funkciójukat egyenlő sizeof (dupla).

Ha a túlterhelés az új üzemeltető megjelenik több globális műveletek új. amelyek közül az egyik meghatározott alapértelmezett nyelv, míg mások túl vannak terhelve. Felmerül a kérdés: hogyan lehet megkülönböztetni az ilyen műveletek? Ez úgy történik, hogy megváltoztatja a számát és típusát érveiket. Ha változás csak a argumentumtípusoknak lehet kétértelmű, ami annak a következménye, esetleges átalakítások ilyen típusú egymással. Ha ezt a kétértelműséget kell hivatkozva az új készlet írja kifejezetten, például:

Az egyik ok, amiért a túlterhelt művelet új. egy erőfeszítés, hogy ez szemantikai, mint amely diagnosztikai információkat és a hiba tolerancia. Emellett az osztály a hatékonyabb memória-kiosztási tervet, mint az, amely biztosítja a rendszer.

Összhangban a szabványos C ++ header fájl Az alábbi funkciók meghatározása tranzakciós új. Ez lehetővé teszi, hogy küldjön, valamint az első kötelező size_t érv és mások.

Ezek a funkciók létrehozására használt kivételek (dob) és saját memóriafoglaló (lefoglaló).

Változat nothrow memóriát, mint rendesen, de ha a kiválasztás nem sikerül, a visszatérési érték 0 helyett generált bad_alloc. Ez lehetővé teszi számunkra, hogy a memóriát használja hibakezelés stratégiát, hogy létrehoz egy kivétel.

Felhasználási feltételek új üzemeltető
  1. Tárgyak szervezett az új korlátlan élettartam. Ezért egy memória területet meg kell szabadítani delete operátor.
  2. Ha a memória számára van fenntartva a tömb, az új üzemeltető visszaad egy pointert az első elem a tömbben.
  3. Ha fenn memória tömb minden dimenziójában kell kifejezni pozitív értékeket.
  4. A tömbök nem lehet inicializálni.
  5. Osztályú objektumokat lehet megszervezni a művelet új. ha az osztály egy alapértelmezett konstruktor.
  6. Linkek nem lehet megszervezni a működését az új, mivel nem memóriát őket.
  7. Működés függetlenül kiszámítja az új igény memória által szervezett adattípus, így az első művelet paraméter mindig típusú size_t.
Hibakezelő művelet új.

Hibakezelés új üzemeltető zajlik két szakaszból áll:

  1. Set, amely jellemzői hibák kezelésére. Megfelelő funkciót kell new_handler típusát és segítségével létrehozott set_new_handler funkciót. A new.h fájlban deklarált
  2. Úgynevezett new_handler megfelelő funkciót. Ezt a funkciót kell:
    • vagy hívja bad_alloc kivételével;
    • vagy a program befejezéséhez;
    • vagy szabadítson fel memóriát, és próbálja terjeszteni az egészet elölről.

Diagnosztikai Osztály bad_alloc bejelentés new.h.

A végrehajtás a Sun ++ tartalmaz egy speciális globális változó _new_handler, amelynek értéke egy mutató new_handler funkció, amely akkor történik, ha nem sikerül új. Alapértelmezésben, ha egy új művelet nem osztja meg a szükséges mennyiségű memória kivétel keletkezett bad_alloc. Kezdetben ez volt az úgynevezett kivétel xalloc és meghatározni except.h fájlt. Xalloc kivétel továbbra is használják számos fordító. Mindazonáltal úgy váltják szabványban meghatározott C ++ neve bad_alloc.

Tekintsük néhány példát.

1. példa A példában használata try blokk. fogás lehetővé teszi, hogy ellenőrizzék sikertelen kísérlet memóriát.

2. példa Amint az előző példában, ha működik a szokásos feltételek mellett, a memória kiosztás hiba nem valószínű, ebben a példában a memória kiosztás hiba erő elérésekor. A folyamat memórialefoglalás addig tart, amíg nem lép fel hiba.

3. példa azt mutatja, túlterhelt működési forma új - üzemeltetés új (nothow).

4. példa mutatják különböző formái túlterhelés művelet új.

Túlterhelés művelet törlésére.

Működés törlése funkció kétféle:

A második forma tartalmaz egy argumentuma típusú size_t. telt törlés. Úgy telt el a fordító, mint az objektum mérete által mutatott p.

A jellemzője a törlés operátor túlterhelés, hogy a globális delete operátor nem lehet túlterhelni. Lehetnek túlterhelt csak azzal, hogy az osztály.

Az alapvető szabályok operátor túlterhelés.

Kapcsolódó cikkek