Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Госы_ТОТТИ.docx
Скачиваний:
19
Добавлен:
24.03.2015
Размер:
6.69 Mб
Скачать

Конструкторы производного класса

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

Пример

class Basis {

public:

Basis(int x, int y) {

a = x; b = y; }

private:

int a, b; };

class Inherit : public Basis {

public:

Inherit(int x, int y, int s)

: Basis (x, y) {

sum = s; }

private: int sum; };

Запомните, что конструктор базового класса вызывается автоматически и мы указываем его в определении конструктора производного класса только для передачи ему аргументов.

  1. Иерархия потоковых классов. Файловый ввод\вывод.

Библиотека потоковых классов построена на основе двух базовых классов: ios и streambuf. Класс streambuf обеспечивает буферизацию данных во всех производных классах, которыми явно или неявно пользуется программист. Класс streambuf обеспечивает взаимодействие создаваемых потоков с физическими устройствами. Он обеспечивает производные классы достаточно общими методами для буферизации данных. Класс ios и производные классы содержат указатель на класс streambuf, но об этом можно до времени не вспоминать. Методы и данные класса streambuf программист явно обычно не использует. Этот класс нужен другим классам библиотеки ввода-вывода. Класс ios содержит компоненты (данные и методы), которые являются общими, как для ввода, так и для вывода.

При работе с потоковой библиотекой ввода-вывода программист обычно достаточно активно использует следующие классы:

ios - базовый потоковый класс; istream - класс входных потоков; ostream - класс выходных потоков; iostream - класс двунаправленных потоков ввода-вывода; istrstream - класс входных строковых потоков; ostrstream - класс выходных строковых потоков; strstream - класс двунаправленных строковых потоков (ввода-вывода); ifstream - класс входных файловых потоков; ofstream - класс выходных файловых потоков; fstream - класс двунаправленных файловых потоков (ввода-вывода); constream - класс консольных выходных потоков.

Диаграмма взаимозависимости перечисленных классов изображена на рисунке 1. Следует отметить, что эта диаграмма потоковых классов упрощена.

Рис.1. Упрощенная схема иерархии потоковых классов

Как наглядно видно из диаграммы классов, класс ios является базовым для классов ostream, istream, и опосредовано базовым для всех остальных потоковых классов. Все общие средства потоковых классов помещаются в класс ios.

Потоковые классы, их данные и методы становятся видимыми и доступными в программе, если в нее включен нужный заголовочный файл:

iostream.h - для классов ios, istream, ostream, stream; strstrea.h - для классов istrstream, ostrstream, strstream; fstream.h - для классов ifstream, ofstream, fstream; constrea.h - для класса constream.

Так как класс ios является базовым для остальных потоковых классов, то включение в текст программы любого из заголовочных файлов strstrea.h, constrea.h или fstream.h автоматически подключает к программе файл iostream.h. Соответствующие проверки выполняются на этапе препроцессорной обработки.

Библиотека iostream поддерживает и файловый ввод/вывод. Все операции, применимые в стандартному вводу и выводу, могут быть также применены к файлам. Чтобы использовать файл для ввода или вывода, мы должны включить еще один заголовочный файл:

#include <fstream>

Перед тем как открыть файл для вывода, необходимо объявить объект типа ofstream:

ofstream outfile("name-of-file");

Проверить, удалось ли нам открыть файл, можно следующим образом:

if ( ! outfile ) // false, если файл не открыт

cerr << "Ошибка открытия файла.\n"

Так же открывается файл и для ввода, только он имеет тип ifstream:

ifstream infile("name-of-file");

if ( ! infile ) // false, если файл не открыт

cerr << "Ошибка открытия файла.\n"

  1. Шаблоны классов, функций и исключения.

Шаблон класса дает обобщенное определение семейства классов, использующее произвольные типы или константы. Шаблон определяет элементы данных и элементы-функции класса. После определения шаблона класса вы можете предписать компилятору генерировать на его основе новый класс для конкретного типа или константы.

Синтаксис шаблона класса имеет следующий вид:

template <список_аргументов_шаблона>

class имя_класса

{ //тело класса

};

За ключевым словом template следуют один или несколько аргументов, заключенных в угловые скобки и отделяемых друг от друга запятыми. Каждый аргумент является либо именем типа, за которым следует идентификатор, либо ключевым словом class, за которым следует идентификатор, обозначающий параметризованный тип. Затем следует определение класса. Оно аналогично определению обычного класса, за исключением того, что использует список аргументов шаблона.

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

template <список_аргументов_шаблона> возвр_тип имя_класса <арг_шаблона> ::

имя_функции(параметры…)

{ // тело функции

}

Управление исключениями

За ключевым словом template следуют один или несколько аргументов, заключенных в угловые скобки и отделяемых друг от друга запятыми. Каждый аргумент является либо именем типа, за которым следует идентификатор, либо ключевым словом class, за которым следует идентификатор, обозначающий параметризованный тип. Затем следует определение класса. Оно аналогично определению обычного класса, за исключением того, что использует список аргументов шаблона.

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

template <список_аргументов_шаблона> возвр_тип имя_класса <арг_шаблона> ::

имя_функции(параметры…)

{ // тело функции

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]