przeciążenie operatora a return

0

Witam

  1. Jeśli mam przykładowy kod z symfonii c++
      friend ostream& operator<<(ostream& strum, const skarv & sk)
      {
             strum << sk.nazwa << " o wartosci "
                   << sk.wartosc << " dukatow";
             return strum;
      }

Nie rozumiem po co tutaj return. Mówi się, że operator zwraca wartość, czego do końca nie rozumiem.
Myślałem, że piszę sobie kod

 strum << sk.nazwa << " o wartosci " 
       << sk.wartosc << " dukatow";

i to wystarcza. Program wywala tekst na ekran i tyle a tu jeszcze jakiś return się pojawia.

  1. Drugie pytanie - lepiej robić funkcję zaprzyjaźnioną friend operator@ czy funkcję wewnątrz klasy? Kiedy lepiej to a kiedy tamto?
1

Też nie wiem, ale mogę się domyślić, to może mieć związek z wielokrotnym wywoływaniem przeładowanego operatora:

cout << a << b;

<< z cout zwróci siebie, więc można wywołać 2. operator.
LUB
Po prostu taka konstrukcja.

Ale to tylko przypuszczenia, niech się ktoś ze "starszych" wypowie.

0

Z jednej strony wypisuje tekst a z drugiej jeszcze coś zwraca, nie rozumiem.
Jeśli ma to związek z wielokrotnym wywoływaniem przeładowanego operatora to pojawia się jeszcze jedno pytanie - skoro funkcja została zdefiniowana z dwoma argumentami ostream& strum, const skarb & sk, czyli z lewej jest argument typu ostream a z prawej typu skarb to już po drugim przeładowaniu mamy i z lewej i z prawej argument typu skarb. Jak więc to działa?

3

cout << a << b << c; to tak jakby ((cout << a) << b) << c. Wykona się to co, jest w środku i zwróci strumień. I znowu, i znowu.

0

I teraz rozumiem! Dzięki!
Czy to przypadkiem nie nazywa się przeładowanie przez l-wartość?

Nurtuje mnie jeszcze pytanie 2)
2) lepiej robić funkcję zaprzyjaźnioną friend operator@ czy funkcję wewnątrz klasy? Kiedy lepiej to a kiedy tamto?

Zazwyczaj w programach widzę, że przeładowane operatory wejścia/wyjścia są funkcjami zaprzyjaźnionymi a nie wewnętrznymi klasy. Nie wiem dlaczego stosuje się taką praktykę.

1

Musisz wiedzieć, że cout to nie funkcja tylko OBIEKT klasy ostream tworzony automatycznie przy starcie naszego programu po dodaniu biblioteki iostream. Dla klasy ostream jest zdefiniowany operator <<, cout jako obiekt tej klasy może używać go dla wszystkich wbudowanych typów(int,float,char). Definicja tego operatoru wygląda mniej więcej tak:

ostream& operator<<(const typ& x);

A więc weźmy przykładowy kod:

int a=1,b=2;
cout<<a<<b;

jest on równoważny z kodem:

int a=1,b=2;
(cout<<a)<<b;

Na początku zostaje wywołane tylko cout<<a, operator wywali wynik na standardowe wyjście i zwróci referencję do obiektu dla którego został wywołany, dzięki temu może zajśc 2 częśc tej linijki czyli cout<<b, zwróc uwagę, że gdyby operator nic nie zwracał wystąpił by błąd. W swoim przypadku zwracasz zmienną strum która jest obiektem klasy ostream co umożliwia używanie takiego typu konstrukcji. Tak to mniej więcej działa :D

0

Co do drugiego: lepiej jest operator zrobić wewnątrz klasy, ale po prostu nie zawsze tak się da(np. omawiany przypadek).

0

Zauważ, że ten operator stanowi metodę klasy ostream. Ty nie możesz modyfikować tej klasy, więc musisz używać funkcji. To co jeszcze jest istotne: nie musi to być funkcja zaprzyjaźniona. To zależy od interfejsu Twojej klasy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1