16.2 Operatory <<>>

Czym są operatory '<<' i '>>'? Pamiętamy z rozdziału o operatorach , że na przykład instrukcja ' a + b' interpretowana jest tak naprawdę jako wywołanie funkcji dodającej, a wartości wyrażeń ab, po ewentualnej konwersji, są do tej funkcji przesyłane jako argumenty. Podobnie jest dla operatorów '<<' i '>>'. Ich użycie powoduje wywołanie odpowiedniej funkcji dwuargumentowej, przy czym jako argumenty przesyłana jest do niej referencja do obiektu-strumienia występującego po lewej stronie i wartość wyrażenia po prawej stronie operatora. Funkcja ta jest przeciążona; wybór konkretnej wersji zależy od typu prawego argumentu. Tak więc dla typów wbudowanych (i wielu bibliotecznych) działanie operatora jest dobrze określone; dla typów definiowanych przez programistę można samemu dostarczyć dodatkowe wersje, co zademonstrujemy w rozdziale o przeciążeniach .

Bardzo ważne jest to, że funkcja wywoływana przez użycie operatora '<<' lub '>>' jest funkcją rezultatową: prócz wykonania samej operacji we/wy, zwraca jako rezultat referencję do tego samego obiektu-strumienia, który był jej pierwszym (lewym) argumentem. Zatem w

       (cout << x) << y;
wartość wyrażenia w nawiasie jest równoważna cout, które w ten sposób staje się ponownie lewym argumentem kolejnego operatora '<<'. Ponieważ wiązanie operatora '<<' jest lewe, więc użycie nawiasów w powyższym przykładzie nie jest konieczne; uzyskujemy dzięki temu możliowość „kaskadowego” wywołania odpowiednich funkcji:
       cout << x << y << z << v << endl;
lub
       cin >> x >> y >> z >> v;
gdzie, jak pamiętamy, kierunek „strzałek” można rozumieć jako kierunek przepływu informacji.


Aby wyprowadzić, na ekran czy do pliku, napis reprezentujący na przykład wartość zmiennej typu double, trzeba przyjąć jakąś umowę co do sposobu formatowania. Sposób ten, jak się przekonamy, można zmieniać. Domyślnie zmienne typów wbudowanych są wyprowadzane zgodnie z następującymi domniemaniami:

Strumienie wyjściowe:

Strumienie wejściowe:

T.R. Werner, 21 lutego 2016; 20:17