Przeładowanie operatora <<, a zwracany rezultat tego przeładowania

0

Przykładowe przeładowanie << dla klasy wektor:

ostream & operator<<(ostream & ekran, wektorek & w)
{
     ekran << w.x;
     return ekran;
}

Nie mogę zrozumieć czemu jest zwracana referencja do obiektu ostream. Służy to do tego aby móc stosować taki zapis: cout << w << v << k. w,v,k to obiekty klasy wektor.
Nie wiem jak ten zapis działa, że zamiast:

cout << w;
cout << v;
cout << k;

jest:

cout << w << v << k;
1

Spójrz na to w taki sposób:

(((cout << w) << v) << k)

Gdybyś zwracał wektorek, to po wykonaniu cout << w miałbyś operator wektorek << wektorek, a takiego nie przeładowujesz.
Za to jak zwrócisz ostream&, to po wykonaniu cout << w masz nadal ostream << wektorek.

0

czyli tak jakby nadpisuje dane ?

0

Bo jeśli zwróci obiekt ostream to do tego obkietu są wpisywane odpowiednie dane, czyli nadpisywane i wyświetlane.

0

Ale że jakie dane nadpisuje?
Nic się nie nadpisuje - zwraca referencję do obiektu ostream, który koniec końców przeładowuje operator ostream << int, czyli to co robisz tutaj: ekran << w.x;

0

return ekran;

Nie "ekran", bo to wcale nie musi być ekran. Zazwyczaj strumień wyjściowy w operatorze nazywany jest out.

Zobacz coś takiego:

cout << a << b <<c;

to jest równoważne z

((cout << a) << b) <<c;

co znaczy, że najpierw jest wykonywane cout<<a, a ponieważ ten operator zwraca swój lewy argument, to całość równa się cout.
następnie mamy (cout << a) << b, ale ponieważ wiemy że cout<<a == cout, to jest to to samo co cout << b. i tak dalej.

nic nie jest nadpisywane: efekty uboczne operatora (zapisanie do strumienia) swoją drogą, ale pamiętaj że na zewnątrz ma to wygląd wyrażenia logicznego (a konkretnie przesunięcia bitowego w lewo) i jako wyrażenie jest obliczane.
tyle tylko że ten operator "przesunięcia w lewo" jest dziwny, bo nic nie przesuwa a zwraca to co ma po lewej.

0
#include <iostream>
int main(){
	std::cout.operator<<(123).operator<<(456);
}

http://4programmers.net/Forum/1157456

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