Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Оператор помещения в поток




ОПЕРАЦИИ ПОМЕЩЕНИЯ И ИЗВЛЕЧЕНИЯ ИЗ ПОТОКА

Простота и последовательность

Расширяемость для новых типов

Простая строка

Безопасность типов

Давайте сравним вызов функций stdio с использованием стандартных потоков. Вызов stdio для чтения выглядит следующим образом:

int i = 25;

char name [ ] = "Простая строка";

fprintf (stdout, "%d \t%s", i, name);

Он правильно напечатает:

Однако, если вы по невнимательности поменяете местами аргументы для fprintf (), ошибка обнаружится только во время исполнения программы. Может произойти все что угодно: от странного вывода до краха системы. Этого не может случиться в случае использования стандартных потоков:

cout << i<<’\t’<< name << '\n';

Так как имеются перегруженные версии оператора сдвига operator<<(type) для всех стандартних типов, то правый оператор всегда будет вызван. Функция cout << i вызывает operator<<(int), a cout<<name вызывает operator<< (const char*). Следовательно, использование стандартных потоков является безопасным по типам данных.

Другим преимуществом стандартных потоков является то, что определенные пользователем типы данных могут быть без труда в них встроены. Рассмотрим тип Pair, который мы хотим напечатать:

struct Pair { int x; string у; }

Все, что нам нужно сделать, это – перегрузить оператор operator << () для этого нового типа Pair, и мы сможем осуществлять вывод следующим образом:

Pair p (25, "December");

cout << p;

Соответствующий оператор operator << () может быть реализован так:

ostream <char> & operator << (ostream <char> & о, const Pair& p)

{

return о << p.x << ' ' << p.y;

}

Библиотека потоков поддерживает единообразный интерфейс ввода-вывода, благодаря широкому использованию перегруженных функций и операторов. Это приводит к более простому и интуитивно понятному синтаксису.

Вывод в поток выполняется с помощью оператора вставки (в поток), которым является перегруженный оператор сдвига влево <<. Левым его операндом является объект потока вывода. Правым его операндом может являться любая переменная, для которой определен вывод в поток (т.е. переменная любого встроенного типа или любого определенного пользователем типа, для которого она перегружена).

Например, оператор:

cout << ”Hello!” << ’\n’;

приводит к выводу в предопределенный поток cout строки "Hello!".

Оператор << возвращает ссылку на объект ostream, для которого он вызван. Это позволяет строить цепочки вызовов оператора вставки в поток, которые выполняются слева направо:

int i = 5;

double d = 2.08;

cout << "i = " << i << ", \td = "<< d << ' \n ';

Эта инструкция приведет к выводу на экран следующей строки: i = 5, d = 2.08

Целочисленные типы форматируются в соответствии с правилами, принятыми по умолчанию, для функции printf () (если они не изменены путем установки различных флагов форматирования). Например, следующие две инструкции дают одинаковый результат:

int i = 1; float f = 2.0;

cout << i << ” ” << f << ’\n’;

printf ("%d %ld\n", i, f);

cout << &i; // отображает адрес указателя в 16-ричной форме

Тип void* используется для отображения адреса указателя.




Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 734; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.