Túlterhelése 49. és szolgáltatók c

Jó napot, kedves olvasók!

Amikor kezdtem tanulmányozásával C ++, már sok kérdés, hogy néha nem tudja, hogy gyorsan megtalálja a választ. Sem kivétel, és egy ilyen téma, mint operátor túlterhelés. Most, hogy már értem ebben a témában, azt akarom, hogy segítsen másoknak, hogy pont az i.

Mi a túlterhelés?

Tegyük fel, hogy hozzon létre az osztály vagy struktúra, akkor azt kell leírni, hogy egy vektor 3-dimenziós térben:

Most létre 3 tárgy ennek szerkezete:

És azt akarja, prirovnyat objektum objektum v2 v1 írd:

Minden működik, de egy példa a vektor nagyon leegyszerűsített, talán van egy ilyen szerkezet, amelyben nem szabad vakon másolni az összes érték az egyik tárgy a másikra (ez az alapértelmezett), és azokat valamilyen manipuláció. Például ne másolja az utolsó részt. Ha a program nem tud róla? Szükséges világos utasításokat, hogy fog teljesíteni.

Ezért kell, hogy terhelje az értékadó operátor (=).

Általános információk operátor túlterhelés

Ehhez adjuk hozzá a mi szerkezet túlterhelés:

Most, a fenti kódot, már meg, hogy a feladat a másolni kívánt az x és y változót. és z értéke nulla.

De ez a transzfer messze nem tökéletes, képzeljük el, hogy a szerkezet nem tartalmaz három változó int típusú, és sok más osztályba tartozó tárgyak, ebben az esetben ez a lehetőség túlterhelés fog működni meglehetősen lassan.

  • Az első dolog, amit tehetünk, hogy küldje meg a túlterhelés módszer nem az egész objektumot, és egy utalás arra a helyre, ahol a tárolás:
Amikor átadjuk a tárgy nincs itt. lényegében létrehoz egy új objektumot (egy példányát, amelyet továbbított a módszer), akkor végezze vele bizonyos költségek, mind időben a program, és a memóriában fogyasztott neki. - Tekintettel a nagy tárgyak.
Elhaladva egy objektum hivatkozással. nincs elosztását az objektum (mondjuk 128 byte), a másolási művelet, a memória csak elkülönített egy mutatót memória cella, amellyel dolgozunk, és ez körülbelül 4-8 bájt. Így a mű egy tárgy a vonalon.
  • De ha elmegyünk egy objektum hivatkozásként válik változó. Ez semmi akadálya minket, ha az értékadó operátor (v1 = v2) a változás nem csak az értéke v1, v2, de még mindig!
    például:

    Természetesen szinte senki épeszű nem fog ilyen nyilvánvaló manipuláció. Mégis, hogy biztonságos legyen, még akkor is megszünteti a lehetőségét egy ilyen változás.
    Ehhez csak meg kell hozzá, éppen mielőtt a const érv, ezért rámutatnak, hogy a módszer nem változott az objektumban.

  • Most térjünk a tekintete a visszatérési típus. Vector3 túlterhelés módszer visszaadja egy objektum, azaz egy új objektumot, ami oda vezethet, hogy ugyanazokat a problémákat, hogy leírtam az első bekezdésben. És a megoldás nem eredeti, nem kell, hogy hozzon létre egy új objektumot - így csak át hivatkozás egy meglévőt.

    De amikor visszatér hivatkozásként jelenhet meg bizonyos problémákat.
    Nem írunk ezt a kifejezést: v1 = (v2 + v3);

    Egy kis kitérő a visszatérés:
    Amikor tanultam a túlterhelés, nem értem:

    Az a tény, hogy az összes művelet muszáj külön és kifejezetten a szervezetben a módszer. Mit jelent, hogy írjon: this-> x = v.x stb
    De akkor miért tér vissza, akkor vissza? Sőt, vissza ebben a példában játszik inkább formális szerepet, akkor is csinálni nélküle:

    És ez a kód elég munka. mert Mindössze annyit kell tennie, azt jelzik a szervezetben a módszer.
    De ebben az esetben nem kaptunk, hogy egy ilyen rekord:

    Retreat 2 (nem kell csinálni):
    Most, hogy tudod, hogy a különbség művelet visszatérési és irányítja a műveletet, tudjuk írni a következő kódot:

    Annak érdekében, hogy megvalósítsa a horror definiáljuk túlterhelés az alábbiak szerint:

  • És amikor túl a hozzárendelés operátor, továbbra is szükség van, hogy megszüntesse az alternatív megbízás abban a ritka esetben, ha bármilyen okból, akkor az objektum rendelve magát: v1 = v1.
    Ehhez hozzá ez az állapot:

    Közötti különbségek egyváltozós és bináris operátorok

    Egyoperandusú szereplők - ezek üzemeltetői, amely akkor aktiválódik, csak egy tárgy, amelyre alkalmazni minden változást

    Binary szereplők - dolgozik 2 tárgyak

    Túlterhelés a test és a test az osztály

    Miért operátor túlterhelés barátságos funkciók (barát)?

    Ha nem nélkülözheti barátságos jellegét a szolgáltató túlterhelés?

    Hiba történik, a következő ok miatt, a szerkezet Vector2 már túlterhelt a + operátor, amely az érték a jobb tart Vector3 típusú, így az első opció működik. De a második esetben, meg kell írni, hogy túlterheli már Vector3 szerkezet, nem 2. Annak érdekében, hogy ne kerüljön az osztály megvalósítása Vector3, tudunk írni egy felhasználóbarát funkció:

    Példák túlterhelés különböző szereplők némi magyarázatot

    Példa túlterhelés bináris +, -, *, /,%

    Példa túlterhelés postfix növelő és csökkentő (var ++, var--)

    Példa túlterhelés előtag formák növelő és csökkentő (++ var, --var)

    A túlterhelés aritmetikai műveletek tárgyakkal más osztályokba

    Túlterhelés egyváltozós plusz (+)

    Túlterhelés unary mínusz (-)

    Példa túlterhelés vegyületet hozzárendelési műveletek + = - =, =, / =,% =

    Egy jó példa a túlterhelés összehasonlító operátorok ==. =,>, <,>= <=

    Példa túlterhelés typecasting műveletek (típus)

    Példa terhelje logikai operátorok. , ||

    Példa terhelje Bitorientált operátorok

    Példa túlterhelés bitenkénti vegyületet hozzárendelés =, | =, ^ =, <<=,>> =

    Egy példa az üzemeltető túlterhelés munka mutatók, és az osztály tagjai [] () *, -> -> *
    Nem látok okot arra, hogy túlterheli (* -> -> *), úgy, hogy az alábbi példák nem.

    Hogyan túlterhelés new és delete. példák:

    Operator túlterhelése vessző,
    Figyelem! Nem tévesztendő össze a vessző operátor továbbítja a jelet! (Vector3 var1, var2;)