Программирование >>  Расширенная версия языка c++ 

1 ... 81 82 83 [ 84 ] 85 86 87 ... 227


258 Самоучитель : , . С++

return 0;

3. Одним из самых интереснхх флагов формата новой библиотеки ввода/вывода является флаг boolalpha. Этот флаг можно установить либо непосредственно, либо с помощью манипулятора Iphii- Интересным этот флаг делает то, что он позволяет реализовать ввод и вывод значений булева типа, т. е. ключевых сло ие и false, вместо которых раньше обхчно приходилось использовать соответственно 1 для истинного значения и 0 для ложного.

Использование флага формата boolalpha ♦include <lostream> using namespace

cou< Перед установкой флага формата boolalpha: ; b = true;

cout b ;

b = taise;

cout b endl;

cou После установки флага формата boolalpha: ;

b true;

cout boolalpha b ; <,

b = false; -

- *4 .1 ,

cou< < endl; -

cou:. Введите значение булева типа: ;

cin - boolalpha >> b; здесь можно ввести true false

cout Введенное значение: b;

return 0;

Примерный результат работы программы:

Перед установкой флага формата boolalpha: 1 О После установки флага формата boolalpha: true false Введите значение булева типа: true Введенное значение: true

Как видите, после установки флага формата boolalpha, для обозначения вводимых и выводимых значений булева типа используются ключевые слова true и false. Отметьте, что флаг формата необходимо устанавливать от-

дельно для потока cin и отдельно для потока cout. Как и в случае с другими флагами формата, установка флага boolalpha для одного потока вовсе не подразумевает его автоматической установки для другого потока.



Глава 8. Введение жтему ввода/вывода C++ 259

1. Выполните еще раз упражнения 1 и 2 из раздела 8.3, только теперь, вместо

функций-членов и флагов формата, используйте манипуляторы ввода/вывода.

2. Составьте инструкцию для вывода числа 100 в системе счисления с отображением основания системы счисления (Ох). Для выполнения задания воспользуйтесь манипулятором setiosflagsO.

3. Объясните, что дает установка флага boolalpha. - -

Пользовательские функции вывода

Как уже отмечалось в это ге, одним из доводов в пользу использования операторов ввода/вывода C++, вместо аналогичных им функций ввода/вывода С, является возможность перегрузки операторов ввода/вывода для создаваемых вами классов. В этом разделе вы узнаете, как перегрузить оператор вывода <<.

В языке C++ вывод иногда называется вставкой (insertion), а оператор << - оператором вставки (insertion operator). Когда вы для вывода информации перегружаете оператор <<, вы создаете функцию вставки (inserterfimctioimim inserter). Рациональность этим терминам дает то, что оператор вывода вставляет frnjer?5) информацию в поток. Во избежание путаницы мы будем называть функцию вставки пользовательской функцией вывода.

У всех пользовательских функций вывода следующая основная форма:

ostream Soperator (ostream fistxeam, Л1мя жласса объект)

тело пользовательской функции вывода return stream,-у .... - . . ,

Первый параметр является ссылкой на объект типа ostream. Это означает, что поток stream должен быть потоком вывода. (Запомните, класс ostream является производным от класса ios.) Второй параметр получает выводимый объект. (Он, если для вашего приложения это нужно, тоже может быть параметром-ссылкой). Обратите внимание, что пользовательская функция вывода возвращает ссылку на поток stream, который имеет тип ostream. Это необходимо, если перегруженный оператор << должен использоваться в ряде последовательных выражений ввода/вывода:

Cout оЫ оЬ< оЬЗ;

Внутри пользовательской функции вывода можно выполнить любую процедуру. То, что будет делать эта функция, полностью зависит от вас. Однако



Для начала рассмотрим простой пример, в котором для класса coord, разработанного в предыдущей главе, создается пользовательская функция вывода:

Использование дружественной функции вывода

для объектов типа coord

tinclude <iostreain> ..... .

usmg namespace std; , , , ..

class coord {

int x, y;

public: = 3<* - .

coord () ( x = 0; у = 0; } coord(int i, in j) { x = i; у = j; }

friend < (ostream sstreaiti, coord ob) ;

в соответствии с хорошим стилем программирования, следует ограничить

задачи пользовательской функции вывода только вставкой информации в

поток.

Хотя это на первый взгляд может показаться ным, но пользовательская функция вывода не может быть членом класса, для работы с которым она создана. И вот почему. Есл -функция любого типа является членом класса, то левый операнд, который неявно передается через указатель this, является объектом, генерирующим вызов оператор-функции. Это подразумевает, что левый операнд является объектом этого класса. Поэтому, если перегруженная оператор-функция является членом класса, тогда левый операнд должен быть объектом этого класса. Однако, когда вы создаете пользовательскую функцию вывода, левый операнд становится потоком, а не объектом класса, а правый операнд - объектом, который нужно вывести.

Именно поэтому пользовательская функция вывода не может быть функцией-членом.

То, что пользовательская функция вывода не может быть на первый взгляд кажется серьезным изъяном C++, поскольку подразумевает, что все данные класса, выводимые в поток через эту функцию, должны быть открытыми, нарушая тем самым ключевой принцип инкапсуляции. Однако это не так. Несмотря на что пользовательские функции вывода не могут быть членами класса, для работы с которым они разработаны, они могут быть дружественными классу. В подавляющем большинстве реальных ситуаций, с которыми вам придется столкнуться при программировании ввода/вывода, перегружаемая пользовательская функция вывода будет дружественной классу, для которого она создана.



1 ... 81 82 83 [ 84 ] 85 86 87 ... 227

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика