Как вы знаете, C++ поддерживает ввод-вывод посредством потоков (таких как iostream, fstream). Вы не задавались вопросом, зачем они нужны, ведь существуют функции, такие как printf, fgets и т.д.? Потоки искользуют переопределённые операторы << и >> для осуществления ввода и вывода, но ведь то же самое можно реализовать и через функции. Для кого-то реализация:

printf("Hello World!");

выглядит более логично и читабельно чем:

cout << "Hello World";

Попробуем ответить. Самое главное — потоковый ввод-вывод безопасен в отношении типов. Такой код:

int a = 123;
printf("%s", a);

ведёт себе абсолютно не так, как вы ожидаете, а вот потоковый вывод:

int a = 123;
std::cout << a;

не имеет таких проблем.

Другая важная особенность потоков — то что они придерживаются методологии объектной ориентированности.  Допустим, вы пишете программу, которая выводит какие-то данные. На определённом этапе разработки вы решаете, что нужно выводить не только в консоль, но ещё и в файл. Как решить эту проблему на уровне языка C? Видимо, нужно заменить вызовы функции printf на fprintf и передавать дескриптор файла вглубь своей программы. В C++ же вам просто нужно заменить экземпляр потока вывода передавая в функцию не std::cout, а файловый поток, а остальной код остаётся без изменений.

void doSomething(std::ostream& output)
{
   output << "this and that" << a;
}
doSomething(std::cout);
doSomething(std::ofstream("c:\file.txt"));

PS: Нужно сказать, что некоторые современные компиляторы проводят проверку типов для функций типа printf.

Advertisements