
- •6. Использование указателя this. Встраиваемые (inline-) функции. Статические члены класса.
- •8. Перегрузка функций (методов класса). Почему следует использовать перегрузку. Перегрузка функций. Перегрузка конструкторов.
- •10.Перегрузка операций (операторов). Понятие перегрузки операторов. Синтаксис перегрузки операции. Перегрузка бинарных операторов.
- •11. Перегрузка операций (операторов). Перегрузка операторов отношения и логических операторов. Перегрузка оператора присваивания. Перегрузка унарных операторов.
- •12. Перегрузка операций (операторов). Перегрузка операторов инкремента и декремента. Перегрузка оператора индексирования. Перегрузка оператора вызова функции.
- •13.Перегрузка операций (операторов). Перегрузка операторов доступа к членам класса. Перегрузка операторов new и delete. Функции преобразования типа.
- •14. Наследование. Производные классы. Синтаксис производного класса. Простое наследование. Множественное наследование. Виртуальные базовые классы. Создание производных классов.
- •15. Полиморфизм и виртуальные функции. Раннее и позднее связывание. Динамический полиморфизм. Виртуальные функции. Виртуальные и невиртуальные функции.
- •16. Полиморфизм и виртуальные функции. Применение динамического полиморфизма. Виртуальные деструкторы. Абстрактные классы и чисто виртуальные функции.
- •Void *memset(void *dest, int cchar, size_t count);
- •25. Стандартный класс string. Конструкторы строк. Изменение величины строки и ее емкости. Присваивание, добавление и обмен строк. Доступ к символам строки.
- •26. Стандартный класс string. Копирование строк и подстроки. Сравнение строк. Операции поиска.
- •27. Стандартный класс string. Вставка символов в строку. Замена и удаление символов из строки. Операции ввода-вывода строк.
- •Int main ()
- •28. Шаблоны. Шаблоны функций. Перегрузка шаблонов функций. Специализация шаблонов функций. Шаблоны функций сортировки.
- •29. Шаблоны классов. Конкретизация шаблона класса. Специализация шаблонов классов. Статические члены шаблонного класса.
- •30.Ключевое слово typename. Недостатки шаблонов.
- •Символьные функции (ctype.H)
- •Проверка, является ли символ цифрой, буквой или символом ascii
- •Проверка на управляющий символ, разделительный символ (пробел, табуляция, перевод строки) и знак препинания
- •Преобразования в код ascii, к верхнему и нижнему регистрам
- •41. Строковые функции (string.H). Работа с функциями манипуляции памятью. Нахождение символа в строке. Сравнение символов в строках. Заполнение буфера при помощи memset().
- •Работа с функциями манипуляции памятью
- •Нахождение символа в строке
- •Сравнение символов в строках
- •Заполнение буфера при помощи memset()
- •Сравнение содержимого двух строк
- •Приведение символов к верхнему регистру
- •43. Математические функции (math.H). Построение таблицы значений тригонометрических функций.
- •Построение таблицы значений тригонометрических функций
- •Структуры для представления даты/времени и параметры функций
- •Работа с функциями localtime() и asctlme()
- •Работа с функциями gmtime() и asctime()
- •Работа с функцией ctime()
- •45. Общие принципы и средства программирования для Windows. Язык Windows. Краткий обзор среды Windows. Преимущества использования Windows.
- •46. Общие принципы и средства программирования для Windows. Графический интерфейс пользователя. Многозадачная среда. Преимущества ввода посредством очереди.
- •48. Программирование для Windows: принципы и понятия. Окно Windows. Элементы интерфейса Windows.
- •49. Программирование для Windows: принципы и понятия. Рамка окна. Заголовок окна. Кнопка оконного меню. Оконное меню. Кнопка свертывания окна. Кнопка развертывания окна.
- •50.Программирование для Windows: принципы и понятия. Вертикальная полоса прокрутки. Горизонтальная полоса прокрутки. Панель меню. Рабочая область окна.
- •52. Программирование для Windows: принципы и понятия. Окна сообщений Windows. Окна диалога Windows. Шрифты Windows. Растровые изображения Windows. Перья Windows. Кисти Windows.
- •61.Новое поколение Windows. Передача информации с помощью сообщений. Независимость от драйверов аппаратуры. Plug-and-play. Библиотеки динамической компоновки. 16 бит против 32 бит.
- •62. Новое поколение Windows. Различные аппаратные платформы. Различные программные платформы. Многопроцессорные системы. Гибкость.
- •63.Новое поколение Windows. Распределенные вычисления. Сертифицированная правительством система обеспечения безопасности. Открытая архитектура систем Windows. Сбои системы. Виртуальная память.
- •64.Требования к программному и аппаратному обеспечению Windows приложений. Требования к программному обеспечению. Требования к аппаратуре.
- •65. Понятия и терминология Windows. Окно Windows. Визуальные компоненты интерфейса. Рамка. Заголовок окна. Кнопка управления или кнопка завершения.
- •66. Понятия и терминология Windows. Системное меню. Кнопка минимизации. Кнопка максимизации. Кнопка завершения.
- •67. Понятия и терминология Windows. Вертикальная полоса прокрутки. Горизонтальная полоса прокрутки. Полоса меню. Клиентская область.
- •68. Классы окон. Объектно-ориентированное программирование. Пиктограммы. Курсоры. Текстовые курсоры. Окна сообщений.
- •71. Ресурсы Windows. Функции Windows. Windows.H и связанные файлы заголовков. Нотация и правила подготовки программ Windows.
- •73. Доступ к оболочке Windows. Система координат. Основные режимы отображения. Координаты устройства.
- •77. Виртуальные клавиши. Системные таймеры. Срабатывание таймера. Эффективное использование механизма таймеров.
- •78. Память. Распределение памяти с помощью операционной системы. Уменьшение количества объектов. Уменьшение размера объекта. Использование перемещаемых объектов.
- •79. Простое приложение Windows. Оболочка для всех приложений. Эффективное использование описателей. Компоненты приложения Windows. Функция WinMain(). Регистрация класса окна.
- •80. Простое приложение Windows. Style. LpfnWndProc. CbClsExtra. CbWndExtra. Hinstance. HIсоn. HCursor. HbrBackground. IpszMenuName. IpszClassName.
- •81. Простое приложение Windows. Создание окна. Отображение и перерисовка окна. Цикл обработки сообщений. Функция GetMessage(). Функция TranslateMessage(). Функция DispatchMessage().
- •82. Простое приложение Windows. Функция окна. Сообщение wm_paint. Сообщение wm_destroy. Функция DefWindowProc(). Написание файла определения модуля.
- •83. Простое приложение и шаблон. Рисование эллипса. Рисование сегмента. Рисование сектора. Рисование прямоугольника.
- •84. Шаблоны приложения. Использование шаблона для создания программы, изображающей синусоиду. Файлы заголовков Windows. Файлы ресурсов. Создание программы для вывода круговых диаграмм.
- •85. Управление окном Windows. Понимание полос прокрутки. Терминология полос прокрутки. Константы полос прокрутки. Диапазон полосы прокрутки. Положение полосы прокрутки. Типы полос прокрутки.
- •96 Работа с ресурсами шрифта. Терминология шрифтов Windows. Константы шрифта. Структура textmetric. Структура logfonta. Ячейка символа шрифта.
- •97 Основные характеристики шрифта. Ширина шрифта. Автоматические кернинг и установка межстрочного интервала. Множества символов oem и ansi.
- •98 Основные характеристики шрифта. Логические и физические шрифты. Векторные, растровые шрифты и шрифты TrueType. Схема отображения шрифтов.
- •99 Выбор семейств шрифтов. Стандартные шрифты. Принтерные шрифты.
- •100 Приложения, управляющие шрифтами. Функция CreateFont(). Функция CreateFontlndirect().
- •102. Средства и методы gdi. Перья. Кисти. Изменение цветов фона. Изменение цветов текста.
- •104 Работа с битовыми образами. Функции BitBlt() и PlgBlt(). Загрузка и вывод на экран битовых образов. Обработка битовых образов при помощи функции Windows nt MaskBlt().
- •105. Вращение графических образов. Вращение прямоугольника.
- •108. Разработка приложений Win32. Важные изменения для переносимости программ в Windows 95 или Windows nt. Типы и структуры данных для Win32. Описатели в Win32.
- •Важные изменения для переносимости программ в Windows 95 или Windows nt.
- •Описатели в Win32.
- •109 Разработка приложений Win32. Менеджер палитр. Использование логической палитры.
- •110 Разработка приложений Win32. Шаблон приложения win32swp. Особенности поддержки Win32 в win32swp.C. Функция WinMain(). Регистрация класса окна. Создание окна.
- •111. Разработка приложений Win32. Отображение и перерисовка окна. Цикл обработки
- •112 Разработка приложений Win32. Функция окна. Обработка сообщений wm_paint. Обработка сообщения wm_destroy. Функция DefWIndowProc().
- •113 Подключение ресурсов. Приложение Win32 win32bar. Круговая диаграмма. Приложение pie.Cpp.
- •116. Библиотека Microsoft Foundation Classes. Необходимость библиотеки mfc. Принципы построения библиотеки mfc. Основные возможности библиотеки mfc.
- •117. Библиотека Microsoft Foundation Classes. Все начинается с cObject. Важнейшие классы библиотеки. Создание приложения mfc Windows. Выбор количества окон, которые будут поддерживаться приложением.
- •118. Библиотека Microsoft Foundation Classes. Базы данных. Поддержка составных документов. Внешний вид приложения и другие опции. Другие опции.
- •119. Библиотека Microsoft Foundation Classes. Имена файлов и классов. Создание приложения. Поработайте самостоятельно.
- •120. Упрощенное приложение. Вывод окна в приложении 23simple.Cpp. Использование afxwin.H. Создание класса, производного от cWinApp. CFrameWnd.
- •121. Упрощенное приложение. Реализация метода Inltlnstance(). Конструктор. Запуск 23simple.Cpp. Упрощение структуры облегчает сопровождение.
- •124. Диалоговые окна и элементы управления. Формирование ресурсов диалогового окна. Задание идентификаторов диалогового окна и элементов управления. Создание диалогового окна Sample Dialog.
- •128. Линейчатая диаграмма с использованием меню и окон диалога.
- •Заголовочный файл 24bar.H.
- •Заголовочный файл ресурсов 24barr.H, файл описания ресурсов 24bar.Rc и файл описания окна диалога 24bar.Dlg.
- •Исходный текст программы 24bar.Cpp.
- •Особенности Microsoft Foundation Classes, относящиеся к Windows 95 и nt.
- •Изучаем win32mfctmp.Cpp.
- •130. Научная графика с использованием ресурсов: меню, окна диалога и мультимедийного звука. Заголовочный файл win32mfcfour.H. Заголовочный файл ресурсов
Void *memset(void *dest, int cchar, size_t count);
После вызова memset() переменная dest указывает на count байтов памяти, которые проинициализированы символьным значением cchar. В следующем примере показана разница между статическим и динамическим объявлением структуры:
// функция memset(). Динамическое выделение памяти
struct keybits
{unsigned char rshift, lshift, ctrl, alt, scroll, numlock, caplock, insert;};
void *memset(void *dest, int cchar, size_t count);
void main(void)
{ keybits stkgarbage, *pstkinitialized; pstkinitialized=new keybits;
memset(pstkinitialized, 0, sizeof(keybits));}
Благодаря функции memset(), динамически созданная структура, на которую указывает переменная pstkinitialized, содержит все нули, в то время как статически созданная структура stkgarbage заполнена произвольными значениями. При вызове функции memset() используется операция sizeof() вместо "зашитого" в оператор фиксированного числа. При этом процедура может автоматически выбирать размер любого передаваемого объекта. В С++ при описании структурных переменных, как в случае с переменными stkgarbage и pstkinitialized, не обязательно использовать ключевое слово struct перед полем тега структуры (keybits).
21. Полнофункционольный ввод/вывод в С++. Форматирование потока. Опции ввода/вывода в С/С++. Список классов iostream.
Существуют два способа форматирования ввода/вывода:
Первый способ предусматривает использование функций для установки определенных флагов форматирования:
skipws Пропускает пробельные символы на входе left Осуществляется ввод с левым выравниванием right Осуществляется ввод с правым выравниванием (по умолчанию)
internal Добавляет заполняющие символы после любого знака или указателя системы счисления до начала числа dec Численные значения выводятся в десятичной форме (по умолчанию) oct Численные значения выводятся в восьмеричной форме hex Численные значения выводятся в шестнадцатиричной форме showbase Отображает числовые константы в формате, который может читать компилятор C++
showpoint Приводит к выводу десятичной запятой и нулей справа для всех чисел с плавающей запятой вне зависимости showpos Приводит к тому, что перед положительным числом будет выводится знак "+"
Функции, которые устанавливают и сбрасывают эти флаги.
setf(), используемая для установки флагов
Для отключения установленных флагов нужно использовать функцию unsetf().
Кроме флага форматирования также можно установить ширину поля потока, символ для заполнения и число цифр после десятичной запятой. Для этого используются следующие функции: int width(int len); устанавливает ширину поля и возвращает текущую ширину
char fill(char ch); устанавливает текущий символ заполнения и возвращает предыдущий символ заполнения
int precision(int num); устанавливает текущий символ заполнения и возвращает предыдущий символ заполнения
второго способа форматирования ввода/вывода - это использование манипуляторов.
Манипуляторы являются специальными функциями, которые позволяют изменять флаги потока. Существуют манипуляторы с параметрами и без
манипуляторы без параметров: ends - помещает в выходной поток нулевой символ;
endl помещает в выходной поток символ конца строки и вызывает метод flush;
flush выгружает буфер потока;
dec, hex, oct устанавливают основания 10, 16 и 8 соответственно;
ws заставляет игнорировать ведущие пробелы при вводе.
Манипуляторы с параметрами setbase(int b) задает основание системы счисления;
resetiosflags(long f) сбрасывает флаги, указанные в параметре;
setiosflags(long f) устанавливает флаги, указанные в параметре;
setfill(int ch) задает заполняющий символ;
setprecision(int n) задает точность вещественных чисел;
setw(int n) задает ширину поля.
Пример форматированного вывода
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
void main(void)
{ long double number, factorial; number = 1.0; factorial = 1.0;
cout.precision(0); // нет знаков после запятой
cout.setf(ios::fixed); // фиксированный формат
for(int i=0; i< 25; i++)
{ factorial *= number; number = number + 1.0;
cout.width(30); // ширина 30 символов
cout << factorial << endl; } }
Опции ввода\вывода в С++
в языке С++ отсутствуют какие-либо встроенные процедуры ввода/ввода. Вместо них все компиляторы С++ поставляются с объектно-ориентированными классами iostream. Эти стандартные объекты классов ввода/вывода синтаксически согласованы, поскольку разрабатывались авторами языка С++. Если нужно написать некоторое приложение С++, переносимое на другие компиляторы С++, то можно использовать классы iostream. В компиляторе Visual С/С++ имеются следующие средства (5 вариантов) для осуществления ввода/вывода в С/С++:
Библиотека С небуферизированного ввода/вывода — Компилятор С обеспечивает небуферизированный ввод/вывод при помощи функций _read() и _write().
Буферизированный ввод/вывод ANSI С — В С имеются также буферизированные функции fread() и fwrite(). Они описаны в библиотеке stdio.h и выполняют собственную буферизацию перед непосредственным обращением к базовым процедурам ввода/вывода.
Библиотека С ввода/вывода на консоль и в порты —_getch(), _ungetch() и _kbhit(), обеспечивающие прямой доступ к аппаратному обеспечению.
Библиотека Microsoft классов iostream —предоставляет программам на С++ возможности объектно-ориентированного ввода/вывода. Ее можно использовать вместо таких функций, как scanf(), printf(), fscanf() и fprintf().cin, cout, cerr и clog, не совместимы с графическим интерфейсом пользователя Windows.
Библиотека Microsoft Foundation Class — Класс Microsoft CFile, находящийся в библиотеке МFС, обеспечивает приложения С++ и, в особенности, Windows - приложения средствами объектного дискового ввода/вывода.
Список классов iostream. Классы потокового ввода.Классы потокового вывода
Все объекты ввода/вывода, описанные в библиотеке iostream, используют оди и тот же базовый класс ios (за исключением классов буферизованных потоков). Эти производные классы делятся на 4 категории.
Классы потокового ввода
Istream |
Используется как универсальное средство ввода или как родительский класс для других производных классов потокового ввода |
Ifstream |
Используется для ввода из файлов |
istream_withassign |
Используется для ввода из потока cin |
Istrstream |
Используется для ввода строк |
Классы потокового вывода
Ostream |
Используется как универсальное средство потокового вывода или как родительский класс для других производных классов потокового вывода |
Ofstream |
Используется для вывода в файл |
ofstream_withassign |
Используется для вывода в потоки cout, cerr и clog |
Ostrstream |
Используется для вывода строк |
Классы потокового ввода/вывода
Классы буферизированных потоков
22. Полнофункционольный ввод/вывод в С++. Классы потокового ввода. Классы потокового вывода. Классы буферизированных потоков. Класс строковых потоков.
Все объекты ввода/вывода, описанные в библиотеке iostream, используют оди и тот же базовый класс ios (за исключением классов буферизованных потоков). Эти производные классы делятся на 4 категории.
Классы потокового ввода
Istream |
Используется как универсальное средство ввода или как родительский класс для других производных классов потокового ввода |
Ifstream |
Используется для ввода из файлов |
istream_withassign |
Используется для ввода из потока cin |
Istrstream |
Используется для ввода строк |
Классы потокового вывода
Ostream |
Используется как универсальное средство потокового вывода или как родительский класс для других производных классов потокового вывода |
Ofstream |
Используется для вывода в файл |
ofstream_withassign |
Используется для вывода в потоки cout, cerr и clog |
Ostrstream |
Используется для вывода строк |
Классы потокового ввода/вывода
Классы буферизированных потоков
Потоковый ввод текста
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
#define iCOLUMNS 80
void main(void)
{ char cOneLine[iCOLUMNS];
ifstream ifInputS("ifstrm.cpp", ios::in);
while(ifInputS)
{ifInputS.getline(cOneLine, iCOLUMNS); cout << '\n' << cOneLine;}
ifInputS.close();}
для создания объекта ifstream и связывания его с дескриптором открытого файла ifInputS используется конструктор класса ifstream. Этот оператор содержит имя файла,а также текстовый режим.. При наличии опции ios::nocreate выполняется проверка существования файла. Целое значение дескриптора файла ifInputS для логических проверок. Метод getline(), унаследованный от класса ifstream, позволяет читать полные строки текста, заканчивающиеся null-символом. имеет три параметра: указатель char *, количество вводимых символов — включая null-символ — и '\n', имена массивов char являются указателями на символы, переменная cOneLine удолетворяет требованиям первого параметра метода. Количество вводимых символов соответствуют размеру массива — iCOLUMNS. Опция разделителя отсутствует. Однако, если входные строки разделяются специальным символом — например, '*' -, то оператор getline() можно записать так:
ifInputS.getline(cOneLine, iCOLUMNS,'*') ;
Затем в приведенной программе печатаются строки, и файл закрывается явно при помощи метода ifInputS.close().
Список классов iostream. Классы буферизированных потоков.Класс строковых потоков
Все объекты ввода/вывода, описанные в библиотеке iostream, используют оди и тот же базовый класс ios (за исключением классов буферизованных потоков). Эти производные классы делятся на 4 категории.
Классы потокового ввода
Классы потокового вывода
Классы потокового ввода/вывода
Классы буферизированных потоков
Streambuf |
Используется как родительский класс для производных объектов |
Filebuf |
Класс буферизированных потоков для дисковых файлов |
strstreambuf |
Класс буферизированнных потоков для строк |
Stdiobuf |
Класс буферизированных потоков для стандартного файлового |
Класс streambuf является основой для потокового ввода/вывода в С++. В нем описаны все основные операции, выполняемые с символьными буферами. Также используется для порождения класса файловых буферов (класс filebuf) и классов istream и ostream, содержащих указатели на объекты streambuf.
Класс строковых потоков
Класс streambuf можно использовать для расширения возможностей класса iostream. Все буферизированные объекты класса streambuf используют фиксированный буфер памяти, называемый областью резервирования. Эту область можно разделить на get-область для ввода и put-область для вывода.
Для объектов streambuf имеются два конструктора, имеющие следующий синтаксис:
streambuf::streambuf();
streambuf::streambuf (char * рг, int nLength) ;
Первый конструктор используется косвенно всеми порожденными от streambuf классами. Он устанавливает в null все внутренние указатели объекта типа streambuf. Второй конструктор создает объект типа streambuf, связывающийся с существующим символьным массивом.
применение класса streambuf
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <math.h>
#include <strstream>
using namespace std;
#define iNYBUFFSIZE 1024
void main(void)
{
char c;
strstreambuf stbMyStreamBuf(iNYBUFFSIZE);
stbMyStreamBuf.sputc('A'); // отдельный символ выдается в буфер
c = stbMyStreamBuf.sgetc();
cout << c << endl;
}
23. Полнофункционольный ввод/вывод в С++. Двоичные файлы. Часто применяемые функции. Объединение программ на С и С++. Использование спецификатора extern "С".
Двоичные файлы
Двоичные файлы или потоки содержат последовательность байтов, полностью соответствующих их представлению на внешнем устройстве. В двоичном файле число прочитанных или записанных байтов совпадает с числом байтов, располагающихся в файле на внешнем устройстве.
Если в программе необходимо считывать исполняемый файл, то это нужно делать в двоичном режиме. Двоичные файлы также используются при считывании и записи чисто информационных файлов, например баз данных.
Объединение программ на С и С++. Использование спецификатора extern "С"
ключевое слово extern указывает на внешнюю связь переменной или функции. В С/С++ можно использовать extern вместе со строкой. Эта строка указывает на то, что для описываемых идентификаторов используются соглашения о компоновке другого языка. По умолчанию для программ С++ задается строка "С++".
По умолчанию в С++ функции можно перегружать. При этом компилятор С++ каждой функции присваивает новое имя. Эту операцию можно отменить, если указать перед описанием функции extern "С". Это необходимо для того, чтобы из программы, написанной на С++, были доступны функции и данные С. Синтаксис записи extern "С" выглядит следующим образом:
extern "С" тип_ функции имя_ функции(тип_параметра (тип_параметров) параметр (параметры));
Следующий оператор показывает, как запись extern "С" используется вместе с прототипом отдельной функции:
extern "С" int fprintf(FILE *stream, char *format, ...);
Для модификации группы прототипов функций нужны фигурные скобки {}:
extern "С" {
….
}
В следующем фрагменте кода модифицируются прототипы функций getc() и рutc():
extern "С" {
int getc(FILE *stream);
int putc(int с, FILE *stream);
}
Ниже приведена программа, показывающая, как использовать запись extern "С":
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <math.h>
#include <strstream>
using namespace std;
#define iMAX 9
extern "C" int imycompare(const void *pi1, const void *pi2);
void main(void)
{
int iarray[iMAX]={1, 9, 2, 8, 3, 7, 4, 6, 5};
for(int i=0; i < iMAX; i++)
cout << iarray[i] << " ";
cout << endl;
qsort(iarray,iMAX, sizeof(int), imycompare);
for(i = 0; i < iMAX; i++)
cout << iarray[i] << " ";
cout << endl;
}
extern "C" int imycompare(const void *pi1, const void *pi2)
{
return(*(int *)pi1 - *(int *)pi2);
}
24. Полнофункционольный ввод/вывод в С++. Создание пользовательских манипуляторов. Манипуляторы без параметров. Манипуляторы с одним параметром. Манипуляторы с несколькими параметрами.
Манипуляторы используются вместе с операциями вставки «и выделения » аналогично выходным данным или входным переменным.
Порядок создания пользовательского манипулятора с параметрами, например для вывода:
Определить класс (MyManip) с полями: параметры манипулятора, указатель на функцию типа ostream &(*f) (ostream &, <параметры манипулятора>);
Определить конструктор этого класса (MyManip) с инициализацией полей.
Определить, в этом классе дружественную функцию - operator <<. Эта функция в качестве правого аргумента принимает объект класса MyManip, левого аргумента (операнда) поток ostream и возвращает поток ostream как результат выполнения функции *f. Например,
typedef ostream &(*PTF) (ostream &, int, int, char);
class MyManip
{
public:
// конструктор
MyManip(PTF F, int W, int N, char FILL)
: f(F),
w(W),
n(N),
fill(FILL)
{}
protected:
int w; int n; char fill; PTF f;
friend ostream &operator <<(ostream &, MyManip); };
ostream &operator <<(ostream &out, MyManip my)
{ return my.f(out, my.w, my.n, my.fill);}
Определить функцию типа *f(fmanip), принимающую поток и параметры манипулятора и возвращающую поток. Эта функция собственно и выполняет форматирование. Например,
ostream &fmanip(ostream &s, int w, int n, char fill)
{ s.width(w); s.flags(ios::fixed); s.precision(n); s.fill(fill); return s; }
Определить собственно манипулятор (wp) как функцию, принимающую параметры манипулятора и возвращающую объект MyManip, поле f которого содержит указатель на функцию fmanip. Например,
MyManip wp(int w, int n, char fill)
{ return MyManip(fmanip, w, n, fill); }
Для создания пользовательских манипуляторов с параметрами можно использовать макросы, которые содержатся в файле <iomanip.h>:
OMANIP(int) IMANIP(int) IOMANIP(int)
Манипуляторы без параметров
Манипуляторы без параметров:
dec - при вводе и выводе устанавливает флаг десятичной системы счисления;
hex - при вводе и выводе устанавливает флаг шестнадцатеричной системы счисления;
oct - при вводе и выводе устанавливает флаг восьмеричной системы счисления;
ws - действует только при вводе и предусматривает извлечение из входного потока пробельных символов (пробел, знаки табуляции '\t' и '\v', символ перевода строки '\n', символ возврата каретки '\r', символ перевода страницы '\f');
endl - действует только при выводе, обеспечивает включение в выходной поток символа новой строки и сбрасывает буфер (выгружает содержимое) этого потока;
ends - действует только при выводе и обеспечивает включение в поток нулевого признака конца строки;
Без специальных манипуляторов операторы вывода будут выглядеть так:
cout << '\а' << "\n\n\t\tImportant data: " << fcritical_mass << endl; // Важные данные
…
using namespace std;
ostream& beep(ostream& os)
{return os << '\a' << "\n\n\t\t\tImportant data: ";}
void main(void)
{ double fcritical_mass = 12459876.12; cout << beep << fcritical_mass << endl;}
Создание пользовательских манипуляторов. Манипуляторы с одним параметром
// манипультор с одним параметром
#include <iostream.h>
#include <iomanip.h>
#include <string.h>
#define iSCREEN_WIDTH 80
ostream& fc(ostream& os, int istring_width)
{
os << '\n';
for(int I = 0; I < ((iSCREEN_WIDTH - istring_width)/2); i++)
os << ' ';
return (os);
}
OMANIP(int) center(int istring_width)
{
return OMANIP(int) (fc, istring_width);
}
void main(void)
{
char *psz="This is auto-centered text!"; // автоцентрирующийся текст
cout << center(strlen(psz)) << psz << endl;
}
Пользовательский параметризованный манипулятор center принимает одно значение, strlen(psz), представляющее собой длину строки. В файле iomanip.h описывается макрос OMANIP(int), расширяемый в класс __OMANIP_int. Описание этого класса включает конструктор и перегруженную операцию вставки в поток ostream. Когда функция center() включается в поток, она вызывает конструктор, который создает и возвращает объект __OMANIP_int. Затем конструктор объектов вызывает функцию fc().