Программирование на C и C++

Онлайн справочник программиста на C и C++

Почему C++ имеет свою собственную систему ввода/вывода

Те, кто программировал на других языках, вероятно, знают, что система ввода/вывода языка С — одна из самых мощных и гибких. Не будет преувеличением сказать, что аналогов ей нет в других системах. Но несмотря на мощь функций ввода/вывода С, эта система не обеспечивает поддержки объектов, определенных пользователем. Это является одной из причин, почему в языке С++ опре­делена своя система функций ввода/вывода. Например, если на языке С создать структуру:

struct my_struct {
int count;
char s[80] ;
double balance;
};

то невозможно приспособить или расширить систему ввода/вывода языка С таким образом, что­бы она могла непосредственно осуществлять ввод/вывод переменных типа my_struct.

Вместе с тем, используя подход С++ к вводу/выводу, можно перегрузить операторы << и >> таким образом, чтобы они знали, как работать с созданными программистом классами. Ранее уже были примеры работы с подобными перегруженными операторами ввода/вывода на консоль. Как будет показано далее, консоль и файловая система ввода/вывода стыкуются между собой в С++ точно так же, как и в С.

Хотя системы ввода/вывода С и С++ содержат фактически одинаковые операторы, тот факт, что система С++ может работать с определенными пользователем типами, неизмеримо повышает гибкость ввода/вывода. Такой подход также помогает предотвратить появление дефектов (bugs). Например, в следующем вызове функции scanf():

char str [80];
int i;
scanf ("%d%s", str, &i );

стоящие в списке аргументов строка и целое число поменялись местами, так что %d соответствует строке str, a %s соответствует целому числу i. Такой вызов не порождает ошибки в языке С, хотя и выдает странный результат. Тем не менее, по всей вероятности, такой вызов функции scanf() является ошибочным. Короче говоря, при вызове функции scanf() в С не осуществляется строгой проверки типов. В противоположность этому, в С++ операции ввода/вывода для всех встроенных типов определены относительно операторов << и >> так, что возможности возникновения по­добной ошибки в нем нет. Вместо этого автоматически будет вызвана корректная операция, кото­рая определяется типом операнда. Эти черты ввода/вывода С++ имеют место также и для опреде­ленных пользователем объектов.