- •3. Указатели и ссылки. Указатель this.
- •4. Использование операторов new и delete.
- •5. Понятие классов и экземпляров классов.
- •6. Описание классов(class, struct, union).
- •7. Вложенные классы.
- •8. Определение объектов при помощи классов.
- •9. Конструкторы и деструкторы классов.
- •10. Атрибуты доступа к компонентам классов.
- •12. Вызов членов класса.
- •11. Объявление и определение методов класса.
- •13. Перегрузка конструкторов. Конструкторы копий.
- •14. Перегрузка операторов отношения.
- •15. Перегрузка логических операторов.
- •16. Перегрузка унарных операторов.
- •17. Перегрузка бинарных операторов.
- •18. Функция оператор как член класса и как friend функция.
- •19. Дружественные функции.
- •20. Доступ к компонентам классов в зависимости от атрибутов доступа.
- •21. Введение в наследование. Базовые классы.
- •22. Производные классы.
- •23. Ограничение доступа к элементам класса. Наследование свойств и модификаторы доступа. Одиночное наследование. Доступ к компонентам производных и базовых классов.
- •24. Конструкторы базовых и производных классов.
- •25. Виртуальные базовые классы. Чисто виртуальные функции.
- •26. Использование указателей на базовые классы и производные классы. Виртуальные методы.
- •27. Потоки ввода-вывода.
- •28. Иерархия классов ввода-вывода. Основные уровни иерархии. Классы потоков.
- •29. Стандартные классы, объекты и механизмы консольного ввода/вывода.
- •30. Стандартные классы, объекты и механизмы файлового ввода/вывода.
- •31. Понятие манипулятора. Реализация пользовательских манипуляторов.
- •32. Файлы последовательного доступа и произвольного доступа.
- •33. Понятие шаблона. Шаблоны функций и классов.
27. Потоки ввода-вывода.
Ostream – это механизм для преобразования значений различного типа в последовательность символов. Обычно эти символы затем выводятся при помощи низкоуровневых операций вывода. Есть много видов символов , которые можно охарактеризовать при помощи свойств символов char_traits. Ostream является специализацией для конкретных видов символов универсального шаблона basic_ostream. Этот шаблон и ассоциированные с ним поерации вывода определены в пространстве имен std и представлены загловочным файлом <iostream> . В <iostream> объявлено несколько стандартных потоков вывода: cout, cerr, clog, wcount, wcerr, wclog. По аналогии с basic_ostream basic_istream определен в <istream>. В istream вводятся два стандвртных потока cin и wcin.
28. Иерархия классов ввода-вывода. Основные уровни иерархии. Классы потоков.
Базовый класс basic_ios представлен в <ios>. Он котролирует форматирование, национальные особенности, и обращение к буферам. Класс ios_base содержит информацию и операции, не зависящие от типа используемых символов – например, точность для вывода числа с плавающей точкой. В <iostream> объявлено несколько стандартных потоков вывода: cout, cerr, clog, wcount, wcerr, wclog. По аналогии с basic_ostream basic_istream определен в <istream>. В istream вводятся два стандвртных потока cin и wcin.
29. Стандартные классы, объекты и механизмы консольного ввода/вывода.
Операции << и >> для потоков
В классах iostream операции >> и << определены для всех встроенных типов языка Си++ и для строк (тип char*). Если мы хотим использовать такую же запись для ввода и вывода других классов, определенных в программе, для них нужно определить эти операции.
class String
{
public:
friend ostream& operator<<(ostream& os,
const String& s);
friend istream& operator>>(istream& is,
String& s);
private:
char* str;
int length;
};
ostream& operator<<(ostream& os,
const String& s)
{
os << s.str;
return os;
}
istream& operator>>(istream& is,
String& s)
{
// предполагается, что строк длиной более
// 1024 байтов не будет
char tmp[1024];
is << tmp;
if (s.str != 0) {
delete [] s.str;
}
size_t length = strlen(tmp);
s.str = new (std::nothrow) char[length + 1];
if (s.str == 0) {
// обработка ошибок
return is;
}
strcpy(s.str, tmp);
return is;
}
Как показано в примере класса String, операция <<, во-первых, является не методом класса String, а отдельной функцией. Она и не может быть методом класса String, поскольку ее правый операнд – объект класса ostream. С точки зрения записи, она могла бы быть методом класса ostream, но тогда с добавлением нового класса приходилось бы модифицировать класс ostream, что невозможно – каждый бы модифицировал стандартные классы, поставляемые вместе с компилятором. Когда же операция << реализована как отдельная функция, достаточно в каждом новом классе определить ее, и можно использовать запись:
String x;
. . .
cout << "this is a string: " << x;
Во-вторых, операция << возвращает в качестве результата ссылку на поток вывода. Это позволяет использовать ее в выражениях типа приведенного выше, соединяющих несколько операций вывода в одно выражение.
