Operátorok a saját típusainkhoz

C++-ban a struktúrák önálló típusokat hoznak létre, amelyekkel a legalapvetőbb műveleteket el lehet végezni: deklaráció (létrehozás), értékadás, paraméterként átadás. Újabb műveleteket függvények segítségével lehet készíteni (mint pl. a fiatalabb függvény). Lehetőség van azonban arra is, hogy az operátorok jelentését is megadjuk a saját típusainkra, például

  Hallgato hallg;
  beolvas(f, hallg);
helyett írhatjuk azt is, hogy
  Hallgato hallg;
  f >> hallg;

C++-ban az operátorok speciális függvények, amelyek működését a túlterhelés segítségével minden típusra külön meg lehet adni. Például egy komplex számot leíró típusra az összeadás operátor:

struct Komplex
{
    double real, imag;
}

Komplex operator + (Komplex bal, Komplex jobb)
{
    Komplex eredm;
    eredm.real = bal.real + jobb.real;
    eredm.imag = bal.imag + jobb.imag;
    return eredm;
}

Vegyük észre, hogy teljesen ugyanolyan, mintha egy osszead nevű függvényt írtunk volna, csak a neve speciális: operator +.

Beolvasó és kiíró operátor

Ezek az operátorok azért speciálisak, mert lehetőséget nyújtanak arra, hogy több adat beolvasását ill. kiírását is megadhassuk egy utasítással, például:

cin >> ev >> ho >> nap;
Ez úgy működik, hogy három függvényhívás történik: az első az ev, a második a ho, a harmadik a nap változóba olvas be egy számot. Mindhárom függvényhíváshoz két paraméterre van szükség: az input streamre (itt a cin), valamint a célváltozóra.

A fenti kifejezés így írható le függvény alakban:

operator >> (operator >> (operator >>(cin, ev), ho), nap);
Mivel mindhárom esetben az első paraméternek a cin-nek kell lennie, ezt csak úgy lehet megoldani, ha ezek az operátorok eredményént magát a cin-t adják vissza, tehát ilyen alakú a kódjuk:
istream& operator >> (istream& inp, int& sz)
{
    // szám beolvasása inp-ről, eltárolása sz-be
    return inp;
}
A függvény tehát ugyanazzal a változóval tér vissza, mint ami az első paramétere. Fontos, hogy referencia típusú paramétere és visszatérési értéke van!

A kiírás ugyanígy működik a másik operátorral (<<) és az ostream& típussal.

Feladatok

  1. Alakítsd át az előző órai programot úgy, hogy kiíró és beolvasó operátort használjon.
  2. Alakítsd át az előző programot úgy, hogy készíts egy Datum típust a szülétési dátumok tárolásához, és erre a típusra készíts összehasonlító operátort (kisebb, < operátort), majd ezt használd a programban.
  3. Készíts térvektor típust! Legyen neki összeadás, kivonás, számmal szorzás, vektoriális szorzás, beolvasás, kiírás művelete. Írj programot, amivel ezeket ki is lehet próbálni.