Программирование >>  Аргументация конструирования 

1 ... 88 89 90 [ 91 ] 92 93 94 ... 108


оператор присвоения Names operator= (Naitie& s)

return * this;

Теперь приведенные ниже операции присвоения оказываются запрещенными. void fn(Names n)

Name newN; newN = n;

Ошибка: эта функция не имеет доступа к operator () !

Теперь функция fn () не имеет доступа к защищенному оператору присвоения.

Такой прием может уберечь вас от проблем, связанных с перегрузкой оператора присвоения и его использованием по умолчанию.



Глсва26

Использование потоков ввода-вывода

/3 э/кой главе...

Нырнем в поток...

Знакомство с подклассами fstream Подклассы strstream Манипулирование манипуляторами Написание собственных операторов вставки Создание умных операторов

главе 11, Отладка программ на C + + , были поверхностно затронуты вопросы, связанные с потоками ввода-вывода. Если вы сопоставите приведенную в этой главе информацию с материалами главы 24, Перегрузка операторов , то поймете, что потоки ввода-вывода основаны не на каком-то новом специфическом множестве символов << и >>, а на операторах сдвига влево и вправо, перегруженных так, чтобы они выполняли соответственно вывод и ввод. (Если вы

не знакомы с перегрузкой операторов, сначала прочитайте главу 24, Перегрузка операторов .)

В этой главе потоки ввода-вывода описываются более детально. Но должен предупредить вас: это слишком большая тема, чтобы всесторонне осветить ее в одной главе; ей посвящены отдельные книги. К счастью для всех нас, написание подавляющего большинства программ не требует глубоких знаний в области

потоков ввода-вывода.

Операторы, составляющие потоки ввода-вывода, определены в заголовочном файле который включает в себя прототипы ряда функций operator>>() и operator<< (). Коды этих функций находятся в стандартной библиотеке, с которой компонуются ваши программы.

операторы для ввода:

istreairui operator>> (istreams source, char* pDest) ; istreani operator>> (istreams source, ints dest) ; istream.i operator>> (istreams source, char st) ; II. . .И так далее . . .

операторы для вывода:

istreams operator<<(ostreams dest, char* pSource); istreams operator (ostreams dest, ints source); istreams operator (ostreams dest, chars source); ...и так далее...




Время вводить новые термины: в применении к потокам ввода-вывода operator>> {) называется оператором извлечения из потока, a operator<< (} - оператором вставки в поток.

Рассмотрим, что случится, если написать следующее:

#include <iostream.h>

void fnO (

cout << Меня зовут Стефан\п ;

Сначала C + + определит, что левый аргумент имеет тип ostream, а правый - тип char*. Вооруженный этими знаниями, он найдет прототип функции operator<< (ostreams, char*) в заголовочном файле iostream.h. Затем С+ + вызовет функцию вставки в поток для char*, передавая ей строку Меня СтефанХп и объект cout в качестве аргументов. Другими словами, он вызовет функцию operator<<(cout, Меня зовут Стефан\п ). Функция для вставки char в поток, которая является частью стандартной библиотеки C+ + , выполнит

необходимый вывод.

Но откуда компилятору известно, что cout является объектом класса ostream? Этот и еще несколько глобальных объектов объявлены в файле iostrean-..h (их список приведен в табл. 26.1). Эти объекты автоматически конструируются при запуске программы, до того как main () получаст управление.

Таблице. 1. Стандартные потокиввода-вывода.

ОБЬЕКТ

КЛАСС

НАЗНАЧЕНИЕ

istream

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

cout

ostream

Стандартный аьтд

cerr

ostream

Стандартный небуферизованный вывод сообщений об ошибках

cLog

ostream

Стандартный буферизованный вывод сообщений об ошибках

Куда делись операторы сдвига

Вы могли бы спросить: А почему именно операторы сдвига? Почему бы не ис- пользовать другой оператор? И вообще, зачем использовать именно перегрузку операторов? . А зачем вы задаете так много вопросов?

Начнем с того, что я не принимал в этом выборе никакого участия. Создатели C + + могли бы . остановиться. на каком-то стандартном имени функции, напри- ;

мер output (), и просто перегрузить эту функцию для выполнения вывода ; всех встроенных типов. Такой составной вывод мог бы выглядеть приблизительно так:

1 void displayNameichar* pName, int age)

: { . . :

output(cout, Имя ); . ; output(cout, pName);

output(cout, ; возраст ) ;

output(cout, age) ; output(cout, \n );

Вместо этого был выбран оператор сдвига влево. Во-первых, это бинарный опера; Top, Т.е. вы можете постазвить объект типа ostream слева от него, а выводимый



1 ... 88 89 90 [ 91 ] 92 93 94 ... 108

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