
- •1.Объявление и определение класса.
- •3. Дружественные функции.
- •4. Пеpегpузка опеpаций ( синтаксис operator)
- •5. Статические компоненты класса.
- •7. Иерархия классов ( последовательность работы конструкторов и деструкторов )
- •8. Доступ к наследуемым компонентам
- •9. Виртуальные функции (когда применяются, форма вызова)
- •10 . Шаблоны ( пример template)
- •15 Преобразование типов данных.
- •17 Ввод-вывод в файл. Сохранение объектов в файле.
- •18 Обработка исключений (блоки try, throw, catch)
- •Примеры обработки исключительных ситуаций
- •20. Паттерны и их классификация. Принцип классификации паттернов проектирования
- •Паттерны проектирования классов/обьектов
- •21. Абстрактная фабрика.
- •22. Классификация типов данных. Система типов
- •Oбщий взгляд
- •Класс String
- •Объявление строк. Конструкторы класса string
- •Операции над строками
- •Цикл foreach
- •Наследование
- •Добавление полей потомком
- •Конструкторы родителей и потомков
- •Интерфейсы
- •Две стратегии реализации интерфейса
- •Преобразование к классу интерфейса
15 Преобразование типов данных.
Конструктор класса, вызванный при создании объектов, выполняет преобразование переменных: базовый_тип->класс. Для обратного преобразования из заданного класса в базовый тип следует определить преобразование типа, добавив в описание класса функцию operator:
class Myclass { double d; . . . public: Myclass(double x) : d(x){ } operator double() {return d; } }; void main() { Myclass mc1(10.83); double mc2; mc2=mc1; }
Аргументом оператора return может быть выражение (*this) .
16 Ввод-вывод, определенный пользователем (перегрузка операций >>, <<)
В основу системы ввода-вывода положена библиотека iostream, заключенная в соответствующие заголовочные файлы. Как уже указывалось, в программах С++ используются обычно 3 стандартных потока ввода-вывода, объявленных как объекты библиотечного класса, помещенного в заголовочный файл iostream.h:
cin – стандартный ввод;
cout – стандартный вывод;
cerr – стандартный вывод ошибок.
Вывод данных
Вывод потока осуществляется перегруженной операцией <<, которая здесь называется операцией вставки. Примеры использования операторов вывода приводились ранее. Упомянем о компонентах класса cout.
Функция write – компонент класса cout – выводит n символов, в том числе, в отличие от вставки, и пробелы:
cout.write(arg, n)
Функция-компонент того же класса put выводит одиночный символ.
Форматирование вывода производится с помощью специальных операций, называемых манипуляторами:
cout<<setw(4)<<i<<setw(6)<<j;
setw(n) – манипулятор, устанавливающий ширину поля для работы следующей после него вставки. В результате для представления i будет отведено поле шириной 4 символа, для j-6 символов.
С помощью манипуляторов можно изменять основание системы счисления выводимых данных (dec,hex,oct), устанавливать точность представления чисел с плавающей точкой (setprecizion), устанавливать символы-заполнители (setfill). Для использования манипуляторов к программе надо подключить заголовочный файл iomanip.h.
Пример использования функций write и setw:
#include <iostream.h> #include <iomanip.h> #include <conio.h> void main() { char* s=new char[3]; s=“ABC”; cout.write(s,1); // Выводится A cout<<endl; cout<<setw(3)<<s<<endl; //Выводится ABC getch(); }
Приведем пример использования потока cerr:
Дополним класс String перегруженной операцией индексирования [] и функцией error:
char& operator [] (int i) { if (i<0 || this->length<i) error("Индекс за границей массива");} void error(char* p) { cerr<<p<<endl ; exit (1);}
Обе функции можно сделать встроенными.
При выполнении программы в случае выхода индекса массива за объявленный диапазон появляется соответствующее сообщение.
Ввод данных
Перегруженная операция >> в классе iostream обеспечивает стандартный ввод и называется извлечением. Как и операция вставки, операция >> действует аналогично соответствующему оператору языка C (scanf), но не требует указаний форматов ввода.
int i; double d; cin>>i>>d;
Левые пробелы, встречающиеся при вводе строковых значений, пропускаются; ввод идет до первого пробела справа, после чего добавляется символ завершения строки. Если при вводе строки пробелы считаются ее частью, то следует воспользоваться функцией cin.read(arg,n), которая вводит n символов. Функция get вводит одиночный символ.
Ввод-вывод данных, определенных пользователем
Вставки и извлечения могут переопределяться для классов (типов), введенных пользователем. Так как они возвращают ссылку на тип собственного класса, то формат перегруженных операций следующий:
istream& operator >>(istream& s, cсылка_на_тип) ostream& operator <<(ostream& s, cсылка_на_тип)
Пример для класса комплексных чисел:
class Complex { double re, im; ........ friend istream& operator>>(istream&, Complex&);
friend ostream& operator<<(ostream&, Complex&); ........ }; istream& operator>>(istream& s, Complex& t) { double a,b;
s>>a>>b; t.re=a; t.im=b; return s; } ostream& operator<<(ostream& s, Complex& t) {
double a,b; s<<t.re<<","<<t.im<<"\n"; return s; }}