Oto jeden z przykładów: Podczas przeciążenia << operator
dla class T
podpis będzie:
std::ostream operator<<(std::ostream& os, T& objT)
gdzie wymaga realizacja będzie
{
//write objT to the os
return os;
}
Dla operatora, pierwsza <<
Argument musi być obiektem ostream, a drugi argumentem obiektem klasy T.
Jeśli spróbujesz zdefiniować operator<<
jako funkcję składową, nie będzie można jej zdefiniować jako std::ostream operator<<(std::ostream& os, T& objT)
. Jest tak dlatego, że funkcje binarnego operatora mogą przyjmować tylko jeden argument, a obiekt wywołujący jest niejawnie przekazywany jako pierwszy argument przy użyciu this
.
Jeśli użyjesz podpisu std::ostream operator<<(std::ostream& os)
jako funkcji składowej, w rzeczywistości otrzymasz funkcję składową std::ostream operator<<(this, std::ostream& os)
, która nie zrobi tego, co chcesz. Dlatego potrzebujesz operatora, który nie jest funkcją członka i może uzyskać dostęp do danych członków (jeśli twoja klasa T ma prywatne dane, które chcesz przesyłać strumieniowo, operator<<
musi być przyjacielem klasy T).
@BROY Twoja edycja jest niepoprawna, funkcja _non-member_ niekoniecznie musi być _friend_. (A także odkryłem, że twoja edycja zmieniła się (bardzo często) (http://stackoverflow.com/posts/1132600/revisions) na oryginalne pytanie.) –