Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shpory_OOP.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.17 Mб
Скачать

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; }}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]