Dlaczego należy przeładowywać operatorów strumieni (< <, >>), aby pozostać przyjaciółmi, a nie członkami klasy?Przeciążenie operatora strumienia
Odpowiedz
Po przeciążeniu operatora binarnego jako funkcji składowej klasy przeciążenie jest używane, gdy argument pierwszy jest typu klasy.
Dla operatorów strumieniowych pierwszym operandem jest strumień, a nie (zwykle) klasa niestandardowa.
Z tego powodu przeciążone operatory strumieni dla niestandardowych klas, które są przeznaczone do używania w tradycyjny sposób, nie mogą być funkcjami składowymi klasy niestandardowej, muszą być funkcjami bezpłatnymi.
(Zakładam, że klasy strumieni nie są otwarte do zmiany, gdyby można było dodać funkcje członkowskie do strumieniowania klas, aby poradzić sobie z dodatkowymi typami niestandardowymi, ale zazwyczaj nie jest to pożądane z punktu widzenia zależności.)
To, czy są przyjaciółmi, czy też nie, zależy od tego, czy potrzebują dostępu do niepublicznych członków klasy.
Myślę, że to trochę mylące. Mogą * mogą * być funkcjami członkowskimi, ale aby używać ich w zwykły sposób (zapis do strumieni), muszą być funkcjami członkowskimi. –
@sztomi: Nie rozumiem twojego komentarza. Nie, oni nie muszą być członkami funkcji; nie mogą być funkcjami członkowskimi (chyba, że piszesz klasę strumieniową lub piszesz operatory strumieniowe wstecz od reszty świata). –
Więc tak, mogą to być funkcje członkowskie. Jeśli chcesz, aby działały jak zwykle (tak jak używa tego inne słowo), musisz zdefiniować je jako przyjaciół. O to mi chodziło. –
Członkowie jakiej klasy? Jaki jest typ lewego argumentu?
Nie muszą one być jednak friend
, chyba że istnieje potrzeba uzyskania dostępu do niedostępnych w inny sposób danych prywatnych.
Więc można powiedzieć:
some_stream << my_class;
Należy zauważyć, że definicja podmiotów członkowskich sprawia, że skrzydła opuścił samodzielne klasy to. np .:
my_class << some_stream;
co nie jest jak standardowe strumienie mają pracować.
- 1. Pytanie operatora strumienia C++
- 2. Przeciążenie operatora C++ [] []
- 3. Przeciążenie operatora w Delphi
- 4. Przeciążenie globalnego operatora typograficznego?
- 5. Przeciążenie operatora w Clojure
- 6. Kontrawariancja i przeciążenie operatora
- 7. Przeciążenie operatora << dla tablic
- 8. Przeciążenie operatora przypisania w C#
- 9. Przeciążenie operatora powoduje przepełnienie stosu
- 10. Czy maszynopis ma przeciążenie operatora?
- 11. R Jednoargumentowe przeciążenie operatora: ryzyko?
- 12. Przeciążenie operatora przestaje działać w pakiecie R.
- 13. Przeciążenie operatora << i rekurencji
- 14. Boolean i String Przeciążenie operatora przypisania (C++)
- 15. C++ lotne i przeciążenie operatora dla aplikacji CUDA
- 16. Przeciążenie operatora i suma Linq w języku C#
- 17. jak przeciążenie Postfix oraz operatora przedrostka w C#
- 18. błąd LINQ - „NotSupportedException: nieobsługiwany przeciążenie wykorzystywane do operatora zapytania«Wybierz»”
- 19. "Niejednoznaczne przeciążenie dla" operatora [] "" jeśli operator konwersji int istnieje
- 20. Prosty sposób na przeciążenie złożonego operatora przypisania w C#?
- 21. Przeciążenie operatora przyjaciel << dla klasy szablonu
- 22. Operator przeciążenie z rodzajowych
- 23. Wywołanie nawias przeciążenie podany wskaźnik
- 24. Operator Przeciążenie w struktury
- 25. Przeciążenie C++ [] z transformacją
- 26. Przeciążanie operatora w .NET
- 27. Przeciążanie statycznego operatora C++
- 28. Przeciążanie operatora w C++
- 29. operator [] = przeciążenie?
- 30. operator() przeciążenie z szablonu C++
To sprawia, że programowanie jest o wiele bardziej ekscytujące, gdy funkcje mają romans z prywatnymi członkami twoich zajęć. – zneak