|
Программирование >> Аргументация конструирования
оператор присвоения 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. Стандартные потокиввода-вывода.
Куда делись операторы сдвига Вы могли бы спросить: А почему именно операторы сдвига? Почему бы не ис- пользовать другой оператор? И вообще, зачем использовать именно перегрузку операторов? . А зачем вы задаете так много вопросов? Начнем с того, что я не принимал в этом выборе никакого участия. Создатели C + + могли бы . остановиться. на каком-то стандартном имени функции, напри- ; мер output (), и просто перегрузить эту функцию для выполнения вывода ; всех встроенных типов. Такой составной вывод мог бы выглядеть приблизительно так: 1 void displayNameichar* pName, int age) : { . . : output(cout, Имя ); . ; output(cout, pName); output(cout, ; возраст ) ; output(cout, age) ; output(cout, \n ); Вместо этого был выбран оператор сдвига влево. Во-первых, это бинарный опера; Top, Т.е. вы можете постазвить объект типа ostream слева от него, а выводимый
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |