Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Программированию.doc
Скачиваний:
49
Добавлен:
11.02.2015
Размер:
1.22 Mб
Скачать

Операции Преобразования

Функция член X::operator T(), где T — имя типа, определяет преобразование из X в T. Например, можно определить тип tiny (крошечный), который может иметь значение только в диапазоне 0...63, но все равно может свободно сочетаться в целыми в арифметических операциях:

class tiny {

char v;

int assign(int i)

{ return v = (i&~63) ? (printf("ошибка диапазона"), 0) : i; }

public:

tiny(int i) { assign(i); }

tiny(tiny &i) { v = i.v; }

int operator=(tiny &i) { return v = i.v; }

int operator=(int i) { return assign(i); }

operator int() { return v; }

};

Диапазон значения проверяется всегда, когда tiny инициализируется int, и всегда, когда ему присваивается int. Одно tiny может присваиваться другому без проверки диапазона. Чтобы разрешить выполнять над переменными tiny обычные целые операции, определяется tiny::operator int(), неявное преобразование из int в tiny. Всегда, когда в том месте, где требуется int, появляется tiny, используется соответствующий ему int. Например:

tiny c1 = 2;

tiny c2 = 62;

tiny c3 = c2 - c1; // c3 = 60

tiny c4 = c3; // нет проверки диапазона (необязательна)

int i = c1 + c2; // i = 64

c1 = c2 + 2 * c1; // ошибка диапазона: c1 = 0 (а не 66)

c2 = c1 -i; // ошибка диапазона: c2 = 0

c3 = c2; // нет проверки диапазона (необязательна)

Пример

Добавим в класс PasSetоперацию объединения множеств "+".

class PasSet {

// …………………………………………………….

friend PasSet operator + (const PasSet &, const PasSet &);

};

PasSet operator + (const PasSet &a, const PasSet &b)

{

PasSet c;

for (int i=0;i<32; i++)

c.data[i]=a.data[i] | b.data[i];

return c;

}

Лекция 13. Переопределение ввода-вывода на языке С++

Стандартный ввод/вывод

С++ предоставляет четыре предварительно определенных потоковых объекта:

  • cin стандартный ввод;

  • cout стандартный вывод;

  • cerr стандартный вывод ошибок;

  • clog полностью буферизованная версия cerr;

Есть возможность перенаправить эти стандартные потоки из и на другие устройства и файлы.

Оператор поразрядного сдвига влево <<, применительно к операциям с потоками, называется оператором вставки или оператором «поместить в», а оператор поразрядного сдвига вправо >> — называется оператором извлечения или оператором «прочитать из».

Класс istream включает перекрываемые определения для оператора >>, используемого со стандартными типами [int, long, double, float, char*(строка)]. Таким образом, предложение cin >> x; вызывает соответствующую функцию оператора >> для istream cin, определенного в iostream.h и использует ее для направления этого входного потока в позицию памяти, представляемую переменной х. Аналогично, класс ostream имеет перекрываемые определения для оператора <<, который разрешает с помощью предложения cout << x; посылать значение x в ostream cout для вывода.

Эти функции оператора возвращают ссылку на соответствующий классовый тип потока (например, ostream&) наряду с перемещением данных. Это позволяет расположить в цепочку несколько таких операторов для ввода и вывода последовательности символов:

int i=0, x=243; double d=0;

cout << "Значение x равно " << x << '\n';

cin >> i >> d; //ввод с клавиатуры int, пробел, затем double

Вторая строка будет выводить на дисплей: «Значение x равно 243», а затем будет идти новая строка. Следующее предложение будет игнорировать пробел, читать и преобразовывать клавишные символы в целое число и помещать его в i, игнорировать следующий пробел, читать и преобразовывать следующие клавишные символы в double и помещать их в d.

Следующая программа просто копирует cin в cout. При отсутствии изменения направления она копирует ввод с клавиатуры на экран:

// COPYKBD.CPP Выводит на экран ввод с клавиатуры

#include <iostream.h>

int main()

{

char ch;

while (cin >> ch)

cout << ch;

}

Примечание. Эта программа просто сохраняет каждый вводимый символ в переменной ch, а затем выводит значение ch на экран.