|
Программирование >> Программирование на языке c++
{ int *р, i=10; p=&i; cout i p } В результате будут последовательно выполнены функции: ostream: :operator (mt), ostream: :operator (const void*) и ostream::operator (char). Пусть задан некоторый тип, определенный пользователем: class my class { int а; char* s; public: my class(int A, char* S) : a(A), s(S) { } ..................... }; Теперь рассмотрим такие новые доопределения оператора <<, которые позволяют использовать его для вывода данных нового типа. Например, запишем следующую функцию operator : ostream& operator (ostream& out stream, my class x) { return out stream my class:\t x.s x.a endl; } Теперь оператор можно использовать для нового типа my class точно так же, как и для встроенных в язык стандартных типов: void main(void) { my class mc{10, a = ); cout mc; } В результате на экран дисплея выводятся следующие данные: my class: а = 10 Следует обратить внимание на то, что доопределение оператора не требует изменения самого библиотечного класса ostream и доступа к его внутренней структуре. 8.3. Ввод данных Ввод данных в языке С++ осуществляется примерно так же, как и вывод. При этом используется доопределенная версия оператора (сдвиг вправо). Выше уже говорилось, что класс iostream является производным от многих классов. Один из этих классов, istream, поддерживает ввод данных, которые поступают из входного потока (обычно с клавиатуры). Если записать выражение: cin а; и если а - это переменная, например, целого типа, то можно присвоить переменной а значение, набрав на клавиатуре целое число и нажав клавишу ВВОД. В приведенном выше примере cin - это объект класса istream (см. рис. 8.2). Если а имеет другой тип, то можно использовать то же выражение. Более того, входной поток можно доопределить и по.яучать из него новые типы данных. Рассмотрим сначала типы данных, определенные в самом языке. Оператор имеет два операнда. Левый операнд - это объект класса istream, а правый операнд - это данное, тип которого задан в самом языке. Для того чтобы доопределить оператор для всех стандартных типов данных, используется соответствующее число функций operator , которые объявляются следующим образом: class istream : public virtual ios { public: istream& operator>>{const char*); ввод строк istream& operator>>(char&); ввод символов istream& operator>>(short&) и т. п. istream& operator>>{int&); istream& operator (long&); istream& operator (float&); istream& operator>>{double&); ..................... }; Каждая функция operator возвращает ссьшку на класс istream (istream&). В результате доопределенный оператор можно применить последовательно (слева направо) к нескольким операндам (так же, как и оператор ). Пусть задан некоторый класс, определенный пользователем: struct my struct { int а; char* s; ..................... }; Рассмотрим новые доопределения оператора , позволяющие использовать его для ввода данных нового типа. Однако в этом случае второй аргумент должен быть ссылкой. Например: istream& operator (istream& in stream, my struct& x) { return in stream >> x.s >> x.a; } Теперь оператор можно использовать для нового класса my struct точно так же, как и для встроенных в язык стандартных типов: void main(void) { my struct ms; cin ms; } В результате данные введем, например, так: Aveiro<Enter> 1995<Enter> При необходимости можно так доопределять операторы и , чтобы комбинировать ввод и вывод, используя только один из этих операторов. Рассмотрим примеры. Первый из них показывает переопределение оператора ввода: #include <iostream.h> #define nm 2 class student { класс СТУДЕНТ char name[100]; имя студента (до 99 символов) unsigned age; возраст студента float average evaluation; средняя оценка студента public: StudentO : age(0),average evaluation(0) { name[0]=NULL; } объявление переопределенной функции operator>> friend istream& operator>>(istream&,student&); void getJnfoO { cout name: name endl << age: age endl average: average evaluation endl; }
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |