318 ___Часть II. Программирование на C++

Помимо этого классы файловых потоков наглядно демонстрируют принцип захвата ресурсов при инициализации (Resource Acquisition is Initialization, RAI). В структурных языках программирования — С, Delphi, Visual Basic и прочих — для того, чтобы правильно использовать ресурс (например, файл), надо, как правило, проделать некоторую предварительную работу. Для начала следует получить его дескриптор, затем открыть файл, удостовериться, что он действительно открылся, использовать его и, наконец, закрыть. Пропуск одного из этих шагов ведет к ошибке.

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

В главе 14 "Базовые концепции классов" вы будете изучать две специальные функции — конструктор (constructor) и деструктор (destructor). Сейчас достаточно знать, что конструктор вызывается при создании объекта, т. е. переменной — экземпляра класса. Когда надобность в объекте отпадает, вызывается вторая специальная функция — деструктор.

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

Короче, для любого объекта с четко определенной процедурой инициализации и деинициализации можно создать подобные "здравствуй" и "прощай". Наверное, вы еще не прочувствовали до конца идею RAI, но поверьте — это здорово. Пока же вам достаточно того, что эта техника была применена при реализации файловых потоков (одной из частей иерархии потоков ввода-вывода), обеспечивающих ясный и надежный механизм работы с файлами в C++.

Если вас смущают новые термины — конструктор, деструктор, объект, экземпляр — для начала можно задвинуть их в нижний ящик стола. Сейчас мы перейдем к примерам, демонстрирующим, насколько просто в C++ обращаться с файлами.

Класс /stream

Чтобы ваше приложение могло управлять файлами, первым делом включите в него заголовок fstream.h, в котором содержатся объявления необходимых классов и функций.

Сделав это, вы можете приступать к созданию объектов файловых потоков как ввода, так и вывода. Если вам так проще, думайте об объектах как о