I/O-virrat
coutin todellinen luonne
Itse olen joskus kummastellut: "C++:ssä on olemassa muuttujia, funktioita, luokkia ja olioita. Mikä ihmeen vetkutin se cout sitten on?" Vaikka ihan ensimmäisestä ohjelmasta asti olet käyttänyt ciniä ja coutia, niin silti niiden olemus lienee hieman epäselvä.
cin ja cout ovat olioita. Ne ovat iostream.h (tai sen "alaisessa" otsikkotiedostossa) valmiiksi määriteltyjä olioita. Niistä löytyy uudelleenmääriteltynä << tai >> operaattori (kts. edellinen osio). Siksi siis kun käskemme coutia tulostamaan - siis kutsumme sen jäsenfunktiota - ei toimenpide vaikuta miltään funktiokutsulta, vaikka se sitä onkin. Sellaisia peijooneita ne operaattorit ovat, varsinkin uudelleenmääritellyt. << -operaattorin käyttäminen kutsuu todellisuudessa operator<<(...) -funktiota, jonka me alla olevassa esimerkissä esiinmerkitsemme:
#include <iostream.h> int main() { int luku = 5; cout << "Ikäni on " << luku << endl; cout.operator<<("Ikäni on ").operator<<(luku).operator<<(endl); return EXIT_SUCCESS; }
Esimerkin kahden viimeisen lauseen tulostama teksti on sama, käytämme funktiokutsun mitä muotoa tahansa. Monien peräkkäisten funktiokutsujen ketjuttaminen onnistuu sen vuoksi, että operator<<(...) palauttaa viittauksen coutiin. Siis alku:
cout.operator<<("Ikäni on ")
... muuttuu funktiokutsun jälkeen lausekkeeksi...
cout
.. ja sen perään voi lykätä uutta funktiokutsua ihan rauhassa. Kuten ehkä arvasitkin, nämä pohdinnot ovat kuin hyvä ranskanleipä: ne toimivat myös toisesta päästä pureskeltuna - siis sama idea pätee ciniin, operaattorin nuolet ovat vain toiseen suuntaan.