Przeciążanie operatorów w C++

Cześć!

Fajnie, że jesteś. Czym jest przeciążanie operatorów ?

To możliwość użycia operatora w sposób niestandardowy w celu osiągnięcia zakładnego rezultatu. Na wstępie warto wspomnieć, że operatory nie rozwiązują żadnych problemów. Są one używane, w celu zapisania czegoś skomplikowanego w sposób prosty.

Jakie wyróżniamy operatory ?

Lista możliwych przeciążeń operatorów jest dosyć długa, dlatego najlepiej podlinkować ich listę:


Od czego zaczniemy Nasze rozważania ?

Rozpoczynamy od operatora przypisania, o którym wspominałem w poprzednim poście. Więc wyjaśnijmy to sobie. Operator przypisania jest przeciążonym operator znaku równości, czyli = . Co on robi ? Głównym celem jest przypisanie zmiennych jednego obiektu, do drugiego. Jednocześnie warto zauważyć, że nie koniecznie musimy robić to co Nam karze operator przeciążenia i równie dobrze możemy wypisać tam sekretne wyznanie. A teraz do rzeczy. Jak to przeciążyć ?

To proste.

NazwaKlasy słowo "operator"(bez cudzysłowów) = (const NazwaKlasy &obiekt tymczasowy)
.
.
.
return *this;

Co oznacza return *this ?
Wskazuje na obiekt. W tym przypadku na obiekt na który został wywołany.

Zróbmy więc prosty program ilustrujący działanie operatora przeciążenia
class Write
{
int n;
public:
Write():n(145){}
int returnN()
{

return n;
}
void showN()
{

std::cout<<n<<'\n';

}

};
class MyClass
{
int n;
public:
MyClass():n(10){}
MyClass operator=(Write &write)
{
this->n = write.returnN();

return *this;

}
void showN()
{

std::cout<<n<<'\n';

}
};

int main()
{

MyClass my;
Write write;
my=write;
my.showN();

}


Powyższy kod pokazuje, jak bardzo potrafi być użyteczny operator przypisania, nawet jeśli będziemy z Niego korzystali rzadko.

Więc pora na kolejny przykład. Tym razem pora na operator przesunięcia bitowego w prawo. Czyli operator: "<<". Zobaczmy jego działania w akcji. Operator << in action:
class MySClass
{
int n;
public:
MySClass():n(10)
{
}
friend std::ostream& operator<<(std::ostream& os, const MySClass& obj);

};
std::ostream &operator<<(std::ostream&os,const MySClass &obj)
{
    os<<obj.n<<'\n';
    return os;
}

int main()
{

MySClass my;
std::cout<<my;

}

A teraz operator wczytania >>, lub jak ktoś woli przeciążony operator przesunięcia w prawo(kierunek wskazują strzałki)
class MySClass
{
int n;
public:
MySClass():n(10)
{
}
friend std::istream& operator>>(std::istream& is, MySClass& obj);

};
std::istream &operator>>(std::istream&is, MySClass &obj)
{
    is>>obj.n;
    return is;
}

int main()
{

MySClass my;
std::cin>>my;

}

Połączmy teraz te dwa operatory by wzajemnie się uzupełniały na wspólnym przykładzie:
#include <iostream>
class MySClass
{
int n;
public:
MySClass():n(10)
{
}
friend std::istream& operator>>(std::istream& is, MySClass& obj);
friend std::ostream& operator<<(std::ostream& os, const MySClass& obj);
};
std::istream &operator>>(std::istream&is, MySClass &obj)
{
    is>>obj.n;
    return is;
}
std::ostream &operator<<(std::ostream&os,const MySClass &obj)
{
    os<<obj.n<<'\n';
    return os;
}
int main()
{

MySClass my;
std::cin>>my;
std::cout<<my;
}

Na razie to wszystko. To był w zasadzie tylko wstęp do przeciążania operatorów. W dalszej części zajmiemy się czymś równie ciekawym. Co to będzie ? Zobaczycie w następnym poście.

Komentarze

Popularne posty z tego bloga

Co dokładnie oznacza std::cout<<"Witaj Swiecie!"<<'\n''; w C++ ?

Klasy, Przestrzenie nazw, Nonlocal, Global i Local. Czy Python ma zmienne prywatne ?