poniedziałek, 14 kwietnia 2014

[C++] Przeładowywanie operatorów

C++ to doskonałe narzędzie głównie z tego powodu, że pozwala robić programiście prawie wszystko, na co on ma ochotę.
Jedną z tych rzeczy jest właśnie przeładowanie operatorów.

Składnia

Przeładowanie można implementować na 2 sposoby:
  1. poprzez funkcję zaprzyjaźnioną
  2. metodę będącą składową klasy
Jaka jest różnica?
Pisząc a@b w pierwszym wypadku wywołanie będzie równoważne do:

 operator@(a,b);

Natomiast w drugim będziemy wołać metodę na rzecz któregoś obiektu:

a.operator@(b);

Przykład:

Powiedzmy, że chcemy sobie przeładować abstrakcyjny operator "@".
Czyli mają naszą klasę typ_arg i chcemy móc korzystać z wyrażenia "a@b"
(tak, żeby było to wyrażenie przemienne, tzn. a@b == b@a).

W klasie musimy sobie zaprzyjaźnić ten operator w następujący sposób.

friend typ_arg operator@(const typ_arg& arg1,const typ_arg& arg2);

Przeładowywanie operatora wypisywanie strumieniowego

Znajduje się w pliku nagłówkowym <ostream> (tym samym w <iostream>).

friend std::ostream& operator<<(std::ostream&, const typ_arg&);

operator << zawsze pobiera jako argument strumień wyjściowy a potem go zwraca, kiedy skończy go modyfikować w odpowiedni sposób.