Задачи 197-198. конструктор копирования
197. Добавьте в класс Bivect методы для вычисления длины вектора, угла между двумя векторами. Перегрузите оператор вызова функции () для вычисления скалярного произведения двух векторов. Пример перегрузки оператора () есть в программе 63.
198. Разработайте класс Polinom для работы с многочленами вида от одной переменной x. Предусмотрите в классе конструктор копирования, оператор присваивания, операторы для выполнения алгебраических действий над многочленами. Перегрузите оператор вызова функции double operator()(double x) для вычисления значения многочлена по заданному аргументу x. Включите в класс функцию рисования графика многочлена на заданном интервале изменения переменной x
Глава 19. Ввод и вывод
Язык C++ не содержит встроенных средств ввода и вывода. Ввод и вывод обеспечивается стандартной библиотекой с заголовочным файлом iostream.h или iostream. При использовании iostream нужно использовать пространство имен std. В C++ можно применять все средства ввода и вывода языка Си, которые становятся доступными после включения в программу заголовочного файла stdio.h.
Средства ввода и вывода языка C++ реализованы в виде иерархии потоковых классов. Поток – это последовательность байтов. С точки зрения программы поток не зависит от тех конкретных устройств, с которыми ведется обмен данными. Поток может быть связан со стандартным устройством ввода (клавиатурой), стандартным устройством вывода (дисплеем), с файлом на диске или с массивом в оперативной памяти. Потоки бывают входными, выходными и двунаправленными, допускающими как чтение, так и запись. В составе библиотеки ввода и вывода предусмотрены средства для включения данных в поток и извлечения данных из потока.
Все потоковые классы имеют в качестве базового класс ios. Для непосредственной организации ввода и вывода используются классы:
istream – класс входных потоков;
ostream – класс выходных потоков.
iostream – класс двунаправленных потоков.
Вывод
В классе ostream есть функции-операторы << для вывода стандартных типов. В качестве результата данные функции возвращают ссылку на объект, для которого вызываются. Ниже приводится фрагмент объявления класса ostream.
class ostream: public ios
{
...
public:
ostream& operator<<(char*); // Вывод строки
ostream& operator<< (int); // Вывод целого
ostream& operator<< (long); // Вывод длинного целого
ostream& operator<< (double); // Вывод double
ostream& operator<< (long double); // Вывод long double
ostream& put(char); // Вывод символа
…
};
Реализация некоторых простых функций вывода выполнена непосредственно в классе, например, функция вывода целого int:
inline ostream& ostream::operator<< (int _i)
{ return *this << (long) _i; }
Видно, что int преобразуется к типу long, затем используется оператор для вывода long и возвращается поток *this, в который произведен вывод. Реализация оператора вывода long в классе не приводится, она содержится в заранее откомпилированной библиотеке.
В файле iostream объявлен объект coutкласса ostream, связанный по умолчанию со стандартным выходным устройством (дисплеем), – стандартный выходной поток. Как уже говорилось, его можно перенаправить на файл средствами операционной системы.
Для ускорения выполнения операций ввода и вывода могут создаваться буфера в оперативной памяти, в которые предварительно помещаются выводимые или вводимые данные. В частности, поток cout имеет буфер.
Для вывода сообщений об ошибках определен объект cerr, всегда связанный со стандартным выходным устройством. Он не имеет буфера, то есть сообщение, направленное в cerr, немедленно появится на экране.
Благодаря тому, что функция operator <<возвращает ссылку на поток, можно писать цепочки вызовов вида:
double x=3.14;
cout << "\nx=" << x;
Последняя инструкции является сокращенной записью инструкции:
cout.operator<<("\nx=").operator<<(x);
Первым вычисляется выражение cout.operator<<("\nx="). При его вычислении выводится строка "\nx=", значением этого выражения является cout. Затем в cout выводится x.
Ввод
В классе входных потоков istream определены функции-операторы >> для ввода стандартных типов. Их объявления похожи на приведенные выше объявления функций вывода <<, только аргументы передаются в эти функции по ссылке, чтобы аргументам можно было присвоить значение внутри функции. Оператор >> ("взять из…") при чтении сначала пропускает все ведущие пробелы, затем извлекает символы для вводимого значения до тех пока не встретит разделитель или недопустимый для вводимой величины символ. Разделителями данных при вводе являются пробелы.
Для организации ввода со стандартного входного устройства в
iostream.h (iostream) объявлен объект cin класса istream, связанный по умолчанию с клавиатурой.
Функция-оператор >> возвращает ссылку на поток, для которого вызывается. Это позволяет строить цепочки вида:
cin >> i >> j >> k;
При наборе на клавиатуре 1 2 3 и нажатии клавиши Enter, переменные i, j, k получат соответствующие значения.
19.3. Ввод и вывод определяемых
пользователем типов
Операторы вывода << и ввода >> можно переопределять для пользовательских типов. Эти операторы являются бинарными и требуют двух операндов. В стандартной библиотеке ввода и вывода предусмотрено, что их первым операндом является поток, поэтому, чтобы сохранить привычный способ их применения для пользовательских типов (классов), нужно при их перегрузке в качестве первого операнда также указывать поток, но в таком случае эти операторы не могут быть членами класса.