Dla jasności cin i cout to faktycznie obiekty, ale uważam ten komentarz, za zbyt zdawkowy dla ogólnego zrozumienia problemu. Języki takie jak C czy C++ nie udostępniają instrukcji wejścia czy wyjścia. Za to odpowiedzialny jest system operacyjny, a istnieją biblioteki wykonane w języku C, C++ czy Asm, któe te funkcje opakowują. W C mamy scanf oraz printf. W języku C++ jest cin oraz cout które są obiektami - czyli bytami zawierającymi zestaw danych oraz funkcji(metod) spełniających daną odpowiedzialność - tutaj wejście wyjście. Wywołanie tutaj odpowiednich metod zapewniają operatory << oraz >>, które są po prostu przeciążone w kontekście tych obiektów, czyli ich działanie jest zmienione dla pewnych klas.
Co do ograniczania się do scanf i printf - nie polecam zakładać tego od razu przy pisaniu programu. Program powinien być na tyle podzielona na warstwy, żeby zmiana warstwy wyjścia, czy prezentacji była łatwa w wymianie, wtedy możemy zmienić sposób wypisywania w zależności od potrzeb, a nie ma co zastanawiać się przedwcześnie nad wydajnością, jak program ma pracować na jakimś serwerze. Program należy wykonać zgodnie ze sztuką, a jak wyjdą problemy z wydajnością, należy go ZBADAĆ pod względem wydajności i dopiero ZLOKALIZOWAĆ WĄSKIE GARDŁA, a nie rzeźbić na ślepo na poziomie pisania kodu.
Jak to mawia mistrz Donald Knut " premature optimization is the root of all evil"