- •Объектно-ориентированное программирование:
- •Содержание
- •Новый тип данных – класс
- •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.5. Манипуляторы
Несмотря на гибкость и большие возможности управления форматами с помощью компонентных функций класса ios, их применение достаточно громоздко. Более простой способ изменения параметров и флагов форматирования обеспечивают манипуляторы.
Манипуляторами называются специальные функции, позволяющие модифицировать работу потока. Особенность манипуляторов состоит в том, что их можно использовать в качестве правого операнда операции >> или <<. В качестве левого операнда, как обычно, используется поток (ссылка на поток), и именно на этот поток воздействует манипулятор.
Для обеспечения работы с манипуляторами в классах istream и ostream имеются следующие перегруженные функции operator.
istream& operator>>(istream&(*_f)( istream&));
ostream& operator<<(ostream&(*_f)(ostream&));
При использовании манипуляторов следует включить заголовочный файл <iomanip.h>.
Приведем список встроенных манипуляторов:
dec – устанавливает десятичную систему счисления;
hex – шестнадцатеричную;
oct – восьмеричную;
endl – вставляет в поток вывода символ новой строки и затем сбрасывает поток;
ends – вставляет ‘\’ в поток вывода;
flush – сбрасывает поток вывода;
ws – выбирает из потока ввода пробельные символы, поток будет читаться до появления символа, отличного от пробельного;
setbase(int) – устанавливает основание системы счисления ;
resetiosflags(long f) – сбрасывает флаги форматирования, для которых в f установлен бит в 1;
setiosflags(long f) – устанавливает те флаги форматирования, для которых в f соответствующие биты установлены в 1;
setfill(int c) – устанавливает символ-заполнитель (с – код символа-заполнителя);
setprecision(int n) – устанавливает точность при выводе вещественных чисел;
setw(int n) – устанавливает минимальную ширину поля вывода.
6.6. Ввод-вывод объектов пользовательских классов
Чтобы использовать операции >> и << с данными типов, определяемых пользователем, необходимо расширить действие этих операций, введя новые операции-функции. Первым параметром операции-функции должна быть ссылка на объект потокового типа, вторым – ссылка или объект пользовательского типа.
Пример 6.6.1
#include <iostream.h>
//Точка в трехмерном пространстве
class Point{
float x,y,z;
public:
Point(float i,float j,float k):x(i),y(j),z(k){};
friend ostreeam operator<<(ostream& stream,Point& p);
friend istreeam operator>>(istream& stream,Point& p);
};
ostream& operator<<(ostream& stream,Point& p)
{
return stream<<”\nx=”<<p.x<<” y=”<<p.y<<” z=”<<p.z<<endl;
}
istream& operator>>(istream& stream,Point& p)
{cout<<”\nx=”; stream>>p.x;
cout<<”y=”; stream>>p.y;
cout<<”z=”; stream>>p.z;
return stream;
}
При перегрузке операторов ввода-вывода для пользовательских типов можно предусмотреть определенный контроль, например, читать только некоторые символы из потока и пропускать все остальные. Это позволит вводить данные в более гибком формате. Например, для класса Point приемлемы следующие входные потоки:
10 20 30
(10, 20, 30)
(10
20
30)
Пример 6.6.2.
#include<ctype.h>
#include <iostream.h>
#include<process.h>
#include<windows.h>
//Точка в трехмерном пространстве
class Point{
float x,y,z;
public:
Point(float i,float j,float k):x(i),y(j),z(k){}
friend ostream& operator<<(ostream& os,Point& p);
friend istream& operator>>(istream& is,Point& p);
};
ostream& operator<<(ostream& os,Point& p)
{return os<<"\nx="<<p.x<<" y="<<p.y<<" z="<<p.z<<endl;}
// Функция помещает в входной поток только символы чисел
void SkipNoDigits(istream& is)
{char c;
for(;;)
{is>>c;
if(isdigit(c)||c==’-‘)
{
is.putback(c); //поместить символ в входной поток
return;}
}}
//Перегрузка операции ввода
istream& operator>>(istream& is,Point& p)
{SkipNoDigits(is);
is>>p.x;
SkipNoDigits(is);
is>>p.y;
SkipNoDigits(is);
is>>p.z;
return is;
}
void main()
{
SetConsoleOutputCP(1251);
Point a(1.1,2.2,3.3);
cout<<"Старые координаты"<<a;
cout<<"Введите новые координаты:";
cin>>a;
cout<<"Новые координаты"<<a;
system("pause");
}
Ниже показан пример выполнения программы
