Aikaisemmin mainittiin että eräs tietovirtojen merkittävimmistä eduista printf- tyyliseen tulostukseen on se, että tietovirtoihin voi tulostaa myös itse tehtyjä olioita. printf:hän ei ole mahdollista enää itse muuttaa ja lisätä uusia %- formaatteja.
Kuormitettaessa esimeriksi << - operaattoria, pitäisi oikeastaan muuttaa sitä tietovirta- luokkaa, johon ollaan tulostamassa.
cout << "Kissa\n"; // tarkoittaa periaateessa: cout.operator<<("Kissa\n");
Onneksi operaattoreista on myös 2- operandiset versiot. Eli
operator<<(cout,"Kissa\n");
Tätä tietoa hyödyntäen voimme kirjoittaa operaattorista version, jonka ansiosta tulostus
cout << tuotteet[i] << "\n";
todella tulostaa tietorakenteen i:n tuotteen.
ostream &operator<<(ostream &os,const cTuote &tuote) { return tuote.tulosta(os); }
Koska tuotteen tulostaminen on sinänsä jo valmis, pitää meidän vain kutsua tuotteen tulosta- metodia operaattorin määrittelyssä. Operaattorin PITÄÄ palauttaa vastaava tietovirta, jotta ketjutulostus:
cout << tuotteet[i] << "\n";
olisi mahdollinen. Tässähän oli itse asiassa kyseessä kutsu
operator<<(operator<<(cout,tuotteet[i]),"\n");
Itse tuote on esitelty vakioviitteeksi operaattorin << parametrilistassa. Viitteeksi, koska on turha siirrellä kokonaisia olioita ja vakioviitteeksi koska tulostuksen aikana tuotetta ei tietenkään muuteta!
Aivan vastaavasti esitellään >> - operaattori:
istream &operator>>(istream &is,cTuote &tuote) { tuote.lue(is); return is; }
Ohjelman tuoterek.cpp lukusilmukka voisi tämän ansiosta olla jopa muodossa
cTuote tuote; while ( f >> tuote ) ynnaa(tuote);
Toisaalta aikaisemmin todettiin että tässä on vaara sotkea rivien järjestys joten parempana voidaan pitää alunperin esitettyä
lue_rivi käsittele_rivi
tapaa.