Przeładowanie operatora <<
Ostatnio zmodyfikowano 2020-02-08 08:09
studentAir Temat założony przez niniejszego użytkownika |
Przeładowanie operatora << » 2020-02-06 20:49:08 std::ostream & operator <<( std::ostream & s, const Vector & v ) { return s << '<' << v.x << ',' << v.y << '>'; }
Jest to kod z kursu, pokazujący właśnie przeladowanie <<. Dlaczego mamy po ostream '&' i tak samo przed s i v? I dlaczego obiekt naszej klasy musi być const? |
|
pekfos |
» 2020-02-06 22:50:27 Przekazywanie argumentów funkcji przez referencjęstd::ostream musi być przez referencję, bo jest niekopiowalne. Dla typu własnego to zależy od typu, w razie wątpliwości domyślnym wyborem powinna być referencja. I dlaczego obiekt naszej klasy musi być const? |
Żeby można było przekazać stały obiekt. |
|
studentAir Temat założony przez niniejszego użytkownika |
» 2020-02-07 12:21:13 Czyli przeladowanie mogloby sie obyc bez referencji i flagi const dla Vectora? i czy z tego samego powodu jest referencja przed operatorem i przed s?
|
|
pekfos |
» 2020-02-07 18:01:42 Czyli przeladowanie mogloby sie obyc bez referencji i flagi const dla Vectora? |
Mogłoby, co nie znaczy że powinno. Przekazywanie przez wartość powinno być rozważane tylko jeśli potrzebna jest kopia obiektu w funkcji, albo gdy obiekt jest trywialnie kopiowalny, więc nie ma negatywnych efektów wydajnościowych kopiowania (a mogą być nawet pozytywne). Rozważając wyłącznie wybór między T i const T&: int i inne typy proste przekazujemy zawsze przez wartość, obiekt zawierający w środku tylko parę prostych elementów też ujdzie. Cokolwiek większego, zarządzającego pamięcią, mającego efekty uboczne przy kopiowaniu lub w ogóle niekopiowalnego - definitywnie przez referencję. Wszędzie gdzie możliwe zachodzi oczywiście wspomniany wcześniej wyjątek, gdy programista podejmuje świadomą decyzję by przekazać element przez wartość. A więc gdy jest ku temu realny powód, a nie że nie chce mu się pisać &. i czy z tego samego powodu jest referencja przed operatorem i przed s? |
Podałem dokładny powód, dla którego std::ostream jest przekazywane i zwracane przez referencję. |
|
studentAir Temat założony przez niniejszego użytkownika |
» 2020-02-08 08:09:49 Dzięki wielkie |
|
« 1 » |