- •Объектно-ориентированное программирование:
- •Содержание
- •Новый тип данных – класс
- •1.2. Доступность компонентов класса
- •1.3. Конструктор и деструктор
- •1.4.4. Статические члены класса
- •1.4. Компоненты-данные и компоненты-функции
- •1.4.1. Данные – члены класса
- •1.4.2. Функции – члены класса
- •1.4.3. Константные компоненты-функции
- •Указатели на компоненты класса
- •1.5.1. Указатели на компоненты-данные
- •1.5.2.Указатели на компоненты-функции
- •1.6. Указатель this
- •1.7. Друзья классов
- •7.1. Дружественная функция
- •1.7.2. Дружественный класс
- •1.8. Определение классов и методов классов
- •2. Наследование
- •2.1. Определение производного класса
- •2.2. Конструкторы и деструкторы производных классов
- •2.3. Виртуальные функции
- •2.4. Абстрактные классы
- •2.5. Включение объектов
- •2.6. Включение и наследование
- •2.7. Множественное наследование
- •2.8. Локальные и вложенные классы
- •2.9. Пример программы для Microsoft Visual Studio
- •2.10. Упражнения
- •3. Перегрузка операций
- •3.1. Перегрузка унарных операций
- •3.2. Перегрузка бинарных операций
- •3.4. Перегрузка операции вызова функции
- •3.5. Перегрузка операции присваивания
- •3.6. Перегрузка операции new
- •3.7. Перегрузка операции delete.
- •3.8. Основные правила перегрузки операций
- •3.9. Примеры программ
- •4. Шаблоны функций и классов
- •4.1. Шаблоны функций
- •4.2. Шаблоны классов
- •4.3. Компонентные функции параметризованных классов
- •4.4. Примеры программ.
- •5. Обработка исключительных ситуаций
- •5.2. Получение дополнительной информации об исключении
- •5.3. Определение типа исключения
- •5.4. Иерархия исключений
- •5.5. Спецификация функций, обрабатывающих исключения
- •6. Потоковые классы
- •6.1. Библиотека потоковых классов
- •6.3. Стандартные потоки ввода-вывода
- •6.4. Форматирование
- •6.5. Манипуляторы
- •6.6. Ввод-вывод объектов пользовательских классов
- •6.7. Определение пользовательских манипуляторов
- •6.8. Пользовательские манипуляторы с параметрами
- •6.9. Использование макросов для создания манипуляторов
- •6.10. Состояние потока
- •6.11. Неформатированный ввод-вывод
- •6.12. Файловый ввод-вывод
- •7.1. Пространство имен
- •7.2. Динамическая идентификация типов
- •7.3. Безопасное приведение типа
- •8. Стандартная библиотека шаблонов
- •8.1. Введение в stl
- •Парадигму обобщенного программирования можно сформулировать следующим образом:
- •8.2. Итераторы
- •8.3. Классы-контейнеры
- •Iterator find(const key_type&k)
- •Iterator lower_bound(const key_type&k)
- •Iterator upper_bound(const key_type&k)
- •8.4. Контейнер vector
- •8.5. Многомерные массивы
- •8.6. Ассоциативные контейнеры
- •8.7. Объекты-функции
- •8.8. Алгоритмы
- •I. Немодифицирующие операции
- •II. Модифицирующие операции
- •III. Сортировка
- •IV. Работа с множествами
- •V. Минимумы и максимумы
- •VI. Перестановки
6.3. Стандартные потоки ввода-вывода
В файле iostream.h определены следующие объекты, связанные со стандартными потоками ввода-вывода.
cin – объект класса istream, связанный со стандартным буферизированным входным потоком.
cout – объект класса ostream, связанный со стандартным буферизированным выходным потоком.
cerr – объект класса ostream, связанный со стандартным небуферизированным выходным потоком для сообщения об ошибках.
clog – объект класса ostream, связанный со стандартным буферизированным выходным потоком для сообщения об ошибках.
Для класса istream перегружена операция >>, а для класса ostream <<. Операции << и >> имеют два операнда. Левым операндом является объект класса istream (ostream), а правым – данное, тип которого задан в языке.
Для того чтобы использовать операции << и >> для всех стандартных типов данных, используется соответствующее число перегруженных функций operator<< и operator>>. При выполнении операций ввода-вывода в зависимости от типа правого операнда вызывается та или иная перегруженная функция operator.
Поддерживаются следующие типы данных: целые, вещественные, строки (char*), для вывода – void* (все указатели, отличные от char*, автоматически переводятся к void*).
Функции operator<< и operator>>возвращают ссылку на тот потоковый объект, который указан слева от знака операции. Таким образом, можно формировать «цепочки» операций.
cout << a << b << c;
cin >> i >> j >> k;
При записи цепочек операторов вывода нужно не забывать о приоритете операций.
Зависимость от компилятора результатов выполнения цепочки операций вывода и необходимость аккуратно учитывать приоритеты операций приводят к следующей рекомендации: изменяемая переменная не должна появляться в цепочке вывода более одного раза.
Извлечение данных из потока начинается только после нажатия клавиши «Enter». При этом при извлечении числовых данных (без буфера) игнорируются начальные пробельные символы. Чтение начинается с первого непробельного символа и заканчивается при появлении нечислового символа.
Значения указателей (т.е. адреса) выводятся в стандартный поток в шестнадцатеричном виде.
Ввод-вывод массивов и символьных массивов-строк – это различные процедуры.
char st[] = ”строка”;
char* pst = st;
cout << st;
cout << pst;
В обоих случаях будет выведено – строка. Операция <<, настроенная на операнд char*, всегда выводит строку, а не значение указателя. Чтобы вывести указатель, необходимо явное приведение типа.
При вводе строки с клавиатуры набираются любые символы до тех пор, пока не будет нажата клавиша Enter. Система ввода-вывода переносит эту последовательность в буфер входного потока, а из буфера при выполнении каждой операции >> извлечение происходит до ближайшего пробела.
6.4. Форматирование
Непосредственное применение операций ввода << и вывода >> к стандартным потокам cout, cin, cerr, clog для данных базовых типов приводит к использованию «умалчиваемых» форматов внешнего представления пересылаемых значений.
Форматы представления выводимой информации и правила восприятия данных при вводе могут быть изменены программистом с помощью флагов форматирования. Эти флаги унаследованы всеми потоками из базового класса ios.
Флаги форматирования определены в public перечислении класса ios следующим образом:
enum {
skipws = 0X0001;
left = 0X0002;
right = 0X0004;
// и т.д.
stdio = 0X4000;
};
Таким образом, флаги форматирования реализованы в виде отдельных фиксированных битов и хранятся в protected компоненте класса long x_flags.
Открытая функция long flags() возвращает значение переменной x_flags. Функция long flags(long f) устанавливает х_flags в новое значение f и возвращает предыдущее значение х_flags.
Функция long setf(long s, long f) устанавливает те биты в x_flags, которые в s и f имеют значение 1. Все биты, которые в s имеют значение 0, а в f – 1, сбрасываются. Возвращает предыдущее значение x_flags, логически умноженное на f.
Функция long setf(long s) устанавливает те биты в x_flags, которые в s равны 1. Те биты, которые в s равны 0, остаются без изменения. Возвращает предыдущее значение x_flags, логически умноженное на s.
Функция long unsetf(long s) сбрасывает те биты, которые в s равны 1. Биты, которые в s равны 0, остаются без изменений. Возвращает предыдущее значение x_flags, логически умноженное на s.
Кроме флагов форматирования используются следующие protected компонентные данные класса ios:
int x_width; – минимальная ширина поля вывода.
int x_precision; – точность представления вещественных чисел (количество цифр дробной части) при выводе.
int x_fill; – символ заполнитель при выводе, по умолчанию – пробел.
Для получения (установки) значений этих полей используются следующие public компонентные функции:
int width();
int width(int);
int precision();
int precision(int);
char fill();
char fill(char);
