Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
39. Просте спадкування. Передача параметрів конструктору базового класу. Обмеження в механізмі спадкування. Доступ до членів батьківського класу при спадкуванні.
Просте спадкування.
Спадкування - механізм об'єктно-орієнтованого програмування, що дозволяє описати новий клас на основі вже існуючого (батьківського), при цьому властивості і функціональність батьківського класу запозичуються новим класом. Іншими словами, клас-спадкоємець реалізує специфікацію вже існуючого класу (базовий клас). Це дозволяє звертатися з об'єктами класу-спадкоємця точно так само, як з об'єктами базового класу. Клас, від якого відбулося спадкування, називається базовим або батьківським. Класи, які походять від базового, називаються нащадками, спадкоємцями або похідними класами. Основні цілі застосування спадкування:
• виключення з програми повторюваних фрагментів коду;
• спрощення модифікації програми;
• спрощення створення нових програм на основі існуючих.
Спадкування є єдиною можливістю використовувати об'єкти, вихідний код яких недоступний, але в які потрібно внести зміни.
Синтаксис спадкування
class производный_класс : [доступ] базовый_класс { описание элементов производного класса };
Обмеження в механізмі спадкування:
• элементы, описанные в секции private базового класса, в производном классе недоступны вне зависимости от ключа. Обращение к ним может осуществляться только через методы базового класса.
• элементы, описанные в секции protected при наследовании с ключом private становятся в производном классе private, в остальных случаях права доступа к ним не изменяются.
•доступ к элементам, описанным в секции public базового класса, при наследовании становится соответствующим ключу доступа
• Если базовый класс наследуется с ключом private, можно выборочно сделать некоторые его элементы доступными в производном классе:
class Base{
...
public: void f();
};
class Derived : private Base{
...
public: Base::void f();
};
Конструкторы базового класса не наследуются, поэтому производный класс должен иметь собственные конструкторы.
Порядок вызова конструкторов при создании объектов:
Сначала автоматически вызывается конструктор предка по умолчанию.
Для иерархии, состоящей из нескольких уровней, конструкторы предков вызываются по порядку, начиная с самого верхнего уровня.
После этого выполняются конструкторы тех элементов класса, которые являются объектами, в порядке их объявления в классе.
Затем исполняется конструктор производного класса.
Если требуется вызвать параметризованный конструктор базового класса или в базовом классе отсутствует конструктор по умолчанию, параметризованный конструктор должен быть явным образом вызван в конструкторе производного класса в списке инициализации.
Доступ до членів батьківського классу при спадкуванні. Есть дочерний класс, и есть родительский.Нужно вызвать функцию родительского. Для этого достаточно указать:
родительский_класс:: имя функции (параметры).
Этого достаточно, чтобы ответить на вопрос, как доступиться к полям или методам одного из родительских классов из дочернего класса при наследовании. Дополнить его должны следующим образом:
1) Поля и методы в дочернем классе могут быть объявлены со спецификаторами public, private, protected. При разных спецификаторах наследование проходит по-разному. (или наследуется, или нет; если наследуется - то с разными правами)
2) Сам родительский класс может быть наследован с разными спецификаторами, это тоже будет влиять на наследование составляющих родительского класса.
40. Множинне спадкування.
В языке С++ имеется возможность в качестве базовых указать несколько классов. В таком случае производный класс наследует методы и атрибуты всех его родителей. Множественное наследование означает, что класс имеет несколько базовых классов. Основным преимуществом множественного наследования является возможность удобно определять логически связанные наборы методов в виде отдельных сущностей, подобных классам, и допускающим наследование и реализацию. Множественное наследование применяется для того, чтобы обеспечить производный класс свойствами двух или более базовых. Чаще всего один из этих классов является основным, а другие обеспечивают некоторые дополнительные свойства, поэтому они называются классами подмешивания. По возможности классы подмешивания должны быть виртуальными и создаваться с помощью конструкторов без параметров, что позволяет избежать многих проблем, возникающих при ромбовидном наследовании.
Пример 1. Предположим, необходимо создать класс, описывающий персональный компьютер. Естественно представить этот класс потомком двух других, описывающих монитор и системный блок. В свою очередь, класс, описывающий системный блок, может быть потомком нескольких классов, описывающих материнскую плату, центральный процессор и т.п.
Проблемы множественного наследования:
1.Возможный конфликт имен методов или атрибутов нескольких базовых классов.
2.Возможность многократного включения базового класса.
Для разрешения конфликтов обычно применяется операция указания области видимости «::» для вызова конкретного метода конкретного родителя.
41. Раннє і пізнє звязування. Динамічний поліформізм.
В С++ полиморфизм поддерживается двумя способами. Во - первых, при компиляции он поддерживается по средствам перегрузки функций и операторов. Такой вид полиморфизма называется статическим полиморфизмом, поскольку он реализуется еще до выполнения программы, путем раннего связывания идентификаторов функций с физическими адресами на стадии компиляции и компоновки. Во-вторых, во время выполнения программы он поддерживается посредством виртуальных функций. Встретив в коде программы вызов виртуальной функции, компоновщик только обозначает этот вызов, оставляя связывание идентификатора функции с ее адресом до стадии выполнения. Такой процесс называется поздним связыванием. Виртуальная функция - это функция, вызов которой (и выполняемые при этом действия) зависит от типа объекта, для которого она вызвана. Объект определяет, какую функцию нужно вызвать уже во время выполнения программы. Этот вид полиморфизма называется динамическим полиморфизмом. Основой динамического полиморфизма является предоставляемая C++ возможность определить указатель на базовый класс, который реально будет указывать не только на объект этого класса, но и на любой объект производного класса. Эта возможность возникает благодаря наследованию, поскольку объект производного класса всегда является объектом базового класса.
42.Віртуальні методи. Віртуальні деструктори. Абстрактні класи та чисто віртуальні функції.
Виртуальные методы один из важнейших приёмов реализации полиморфизма. Они позволяют создавать общий код, который может работать как с объектами базового класса, так и с объектами любого его класса-наследника. При этом базовый класс определяет способ работы с объектами и любые его наследники могут предоставлять конкретную реализацию этого способа. Базовый класс может и не предоставлять реализации виртуального метода, а только декларировать его существование. Такие методы без реализации называются «чистыми виртуальными» (перевод англ. pure virtual) или абстрактными. Класс, содержащий хотя бы один такой метод, тоже будет абстрактным. Объект такого класса создать нельзя (в некоторых языках допускается, но вызов абстрактного метода приведёт к ошибке). Наследники абстрактного класса должны предоставить реализацию для всех его абстрактных методов, иначе они, в свою очередь, будут абстрактными классами.
Для каждого класса, имеющего хотя бы один виртуальный метод, создаётся таблица виртуальных методов. Каждый объект хранит указатель на таблицу своего класса. Для вызова виртуального метода используется такой механизм: из объекта берётся указатель на соответствующую таблицу виртуальных методов, а из неё, по фиксированному смещению, указатель на реализацию метода, используемого для данного класса. При использовании множественного наследования или интерфейсов ситуация несколько усложняется за счёт того, что таблица виртуальных методов становится нелинейной.
Віртуальні деструктори.С++ позволяет объявить деструктор виртуальным так же, как и обычную член-функцию. Тогда деструкторы всех классов, порожденных из класса, в котором объявлен виртуальный деструктор, также будут виртуальными.
Использование виртуальных деструкторов позволяет обеспечить вызов соответствующего деструктора при разрушении объектов оператором delete, даже если тип разрушаемого объекта неизвестен на стадии компиляции. При удалении объекта производного класса, на который ссылается указатель базового класса, если деструктор объявлен как виртуальный, то будет вызван деструктор соответствующего производного класса. Затем деструктор производного класса вызовет деструктор базового класса и объект будет правильно удален (удален целиком). В противном случае будет вызван только деструктор базового класса и произойдет утечка памяти.
Тоесть:
•используйте виртуальный деструктор, если в базовом классе имеются виртуальные функции;
•используйте виртуальные функции только в том случае, еcли программа содержит и базовый, и производный класс
•не пытайтесь создать виртуальный конструктор.
Абстрактні класи та чисто віртуальні функції
Классы могут быть созданы для того, чтобы предписать протокол взаимодействия с объектами, принадлежащими соответствующему типу. Эти классы называются "абстрактными", потому что никакой объект этого класса не может быть создан. Они существуют исключительно для создания производных классов.
Абстрактный класс это класс, содержащий по меньшей мере одну виртуальную функцию. Производные от него классы должны реализовывать эти чисто виртуальные функции, иначе, если останется хоть одна нереализованная чисто виртуальная функция, такой класс также будет абстрактным. Чисто виртуальная функция объявляется с помощью следующего синтаксиса:
virtual <имя_функции> (<список_параметров>) = 0;
Существуют определенные ограничения на использование абстрактных классов. Они не могут использоваться в качестве:
•переменных, являющихся членами некоторых других классов;
•типов передаваемых в функцию аргументов;
•типов возвращаемых функцией значений;
•типов явных преобразований.
Другое ограничение состоит в том, что если конструктор абстрактного класса вызывает чисто виртуальную функцию, прямо или косвенно, результат непредсказуем.
Чисто виртуальные функции могут быть не только объявлены, но и определены в абстрактном классе. Они могут быть непосредственно вызваны только с использованием следующего синтаксиса:
<имя__абстр__класса>: :<имя_вирт_функции> (<список_параметров>)
Этот синтаксис используется, например, при разработке иерархии классов, базовые классы которой содержат чисто виртуальные деструкторы. пример:
#include <iostream.h>
class Base
{
public:
Base(){}
//Чисто виртуальный деструктор
virtual ~Base() = 0;
//Определение деструктора
Base::Base()
{
}
class Derived: public Base
{
public:
Derived() {}
**Derived() {}
};
void main()
{
Derived* pDerived = new Derived;
delete pDerived;
}
деструктор базового класса всегда вызывается в процессе разрушения объекта. Когда объект, на который указывает pDerived, удаляется, вызывается деструктор класса Derived, a затем деструктор базового класса. Пустая реализация для чисто виртуальной функции (в данном случае - деструктора) гарантирует, что для этой функции существует хоть какая-то реализация. К абстрактным классам применимы следующие правила:
•абстрактный класс не может использоваться в качестве типа аргумента, передаваемого функции;
•абстрактный класс не может использоваться в качестве типа возвращаемого значения функции;
•нельзя осуществлять явное преобразование типа объекта к типу абстрактного класса;
•нельзя объявить представитель абстрактного класса;
•можно объявить указатель или ссылку на абстрактный класс.
43.Перевантаження функцій. Перевантаження конструкторів. Перевантаження операторів.
Перевантаження функцій.
Перегрузка - это практика предоставления более чем одного определения для данного имени функции в одной и той же области видимости. Возможность выбрать соответствующую версию функции, основываясь на типах и числе аргументов, с которыми она вызывается, предоставляется компилятору. При этом два типа данных считаются различными, если для них используются различные инициализаторы. Поэтому аргумент данного типа и ссылка на этот тип рассматриваются как одно и то же с точки зрения перегрузки. Например, объявление двух таких функций:
int func(int, int) и int func{int&, int&)
приведет к ошибке, так как с точки зрения перегрузки они считаются одинаковыми. По той же причине аргументы функции, относящиеся к некоторому типу, модифицировавшие const или volatile, не рассматриваются как отличные от базового типа с точки зрения перегрузки.
Перевантаження конструкторів
Чаще всего перегрузка применяется при создании перегруженных конструкторов.Цель этой перегрузки - предоставить пользователю как можно больше вариантов создания представителей класса. Если класс предоставляет конструктор с параметрами и конструктор по умолчанию, то имеем дело с перегрузкой конструкторов. Конструктор по умолчанию необходим при выделении динамической памяти массиву объектов (ибо динамический массив объектов не может быть инициализирован). Также возникает необходимость в перегрузке конструкторов, - желание обеспечить пользователя конструкторами преобразования типа.
Перевантаження операторів
В С++ имеется возможность перегрузки большинства встроенных операторов. Операторы мотут быть перегружены глобально или в пределах класса. Перегруженные операторы реализуются как функции с помощью ключевого слова operator. Имя перегруженной функции должно быть operatorX, где X - это перегруженный оператор. Ключевое слово operator, за которым следует символ оператора, называется именем операторной функции. Операторы, которые можно передружать: логическое не, запятая,не равно,присваивание, равно…). чтобы перегрузить оператор сложения, нужно определить функцию с именем operator+, а чтобы перегрузить оператор сложения с присваиванием, нужно определить функцию operator+=.
44. Шаблони функцій. Шаблони класів.
Шаблони функцій.Шаблоны позволяют давать обобщенные, в смысле произвольности используемых типов данных, определения функций и классов. Поэтому их часто называют параметризованными функциями и параметризованными классами. Часто также используются термины шаблонные функции и шаблонные классы. Шаблон функции представляет собой обобщенное определение функции, из которого компилятор автоматически создает представитель функции для заданного пользователем типа (или типов) данных. Когда компилятор создает по шаблону функции конкретного ее представителя, то говорят, что он создал порожденную функцию. Синтаксис объявления шаблона функции имеет следующий вид:
template <class Т1 | Т1 иден1,class Т2|Т2 иден2,. . . , class Тn|Тn идентn>
возвр_тил имя_функции(список параметров)
{
//тело функции
}
За ключевым словом template следуют один или несколько параметров, заключенных в угловые скобки, разделенные между собой запятыми. Каждый параметр является:
•либо ключевым словом class, за которым следует имя типа;
•либо именем типа, за которым следует идентификатор.
Для задания параметризованных типов данных вместо ключевого слова class может также использоваться ключевое слово typename.
Шаблони класів.Шаблон класса представляет собой обобщенное определение класса, включающее типы данных в качестве параметров, из которого компилятор автоматически создает класс для заданных пользователем типов данных. Когда компилятор создает по шаблону класса конкретный класс для определенных пользователем типов данных, то говорят, что он создал порожденный класс. В связи с этим обстоятельством шаблон класса называют иногда родовым классом. Синтаксис объявления шаблона класса имеет следующий вид:
template <class T1 |Т1 идент1, ,class T2|Т2 идент2, …, class Тn|Тn идентn>
class имя_класса
{
//тело класса
}
За ключевым словом template следуют один или несколько параметров, заключенных в угловые скобки, разделенные между собой запятыми. Каждый параметр является:
•либо ключевым словом class, за которым следует имя типа;
•либо именем типа, за которым следует идентификатор.
Затем следует объявление класса. Объявление и определение класса используют список параметров шаблона. Для задания параметризованных типов данных вместо ключевого слова class в угловых скобках может также использоваться ключевое слово typename. Как и в случае шаблонных функций, ключевое слово class или typename показывает, что параметр представляет или встроенный, или определенный пользователем тип даннях
45. Обробка виключних ситуацій. Обробка помилок в потоках.
Обробка виключних ситуацій
Исключительная ситуация, или исключение это возникновение непредвиденного или аварийного события, которое может порождаться некорректным использованием аппаратуры. Например, это деление на ноль или обращение по несуществующему адресу памяти. Обычно эти события приводят к завершению программы с системным сообщением об ошибке. C++ дает программисту возможность восстанавливать программу и продолжать ее выполнение.
Исключения C++ не поддерживают обработку асинхронных событий, таких, как ошибки оборудования или обработку прерываний, например, нажатие клавиш Ctrl+C. Механизм исключений предназначен только для событий, которые происходят в результате работы самой программы и указываются явным образом.
Исключения возникают тогда, когда некоторая часть программы не смогла сделать то, что от нее требовалось. При этом другая часть программы может попытаться сделать что-нибудь иное.
Исключения позволяют логически разделить вычислительный процесс на две части обнаружение аварийной ситуации и ее обработка. Это важно не только для лучшей структуризации программы. Главной причиной является то, что функция, обнаружившая ошибку, может не знать, что предпринимать для ее исправления, а использующий эту функцию код может знать, что делать, но не уметь определить место возникновения. Это особенно актуально при использовании библиотечных функций и программ, состоящих из многих модулей.
Другое достоинство исключений состоит в том, что для передачи информации об ошибке в вызывающую функцию не требуется применять возвращаемое значение, параметры или глобальные переменные, поэтому интерфейс функций не раздувается. Это особенно важно, например, для конструкторов, которые по синтаксису не могут возвращать значение.
Обробка помилок в потоках
В базовом классе ios определено поле state, которое представляет собой состояние потока в виде совокупности битов:
Enum io_state {
goodbit = 0x00. // Нет ошибок
eofbit = 0x01. // Достигнут конец файла
fallbit = 0x02. // Ошибка форматирования или преобразования
badbit = 0x04. // Серьезная ошибка, после которой пользоваться потоком невозможно
hardfall = 0x08 // Неисправность оборудования
}:
Состоянием потока можно управлять с помощью перечисленных ниже методов и операций:
int rdstate( ) возвращает текущее состояние потока;
int eof( ) возвращает ненулевое значение, если установлен флаг
int fail ( ) - возвращает ненулевое значение, если установлен один из флагов failbit, badbit или hardfail;
int bad( ) - возвращает ненулевое значение, если установлен один из флагов badbit или hardfail;
int good( ) - возвращает ненулевое значение, если сброшены все флаги ошибок;
void clear(int = 0) параметр принимается в качестве состояния ошибки, при отсутствии параметра состояние ошибки устанавливается 0;
operator void * ( )- возвращает нулевой указатель, если установлен хотя бы один бит ошибки;
operator ! ( )- возвращает ненулевой указатель, если установлен хотя бы один бит ошибки.
46. Форматування потоків. Прапори форматування потоків. Маніпулятори.
Форматування потоків.
Для управління форматуванням введення-виводу передбачено три види засобів: форматуючі функції, прапори і маніпулятори. Всі ці засоби є членами класу ios і тому доступні для всіх потоків.Если формат вывода, используемый по умолчанию, не устраивает программиста, он может скорректировать его с помощью методов классов ввода/вывода, флагов форматирования и так называемых манипуляторов. В потоковых классах форматирование выполняется тремя способами - с помощью флагов, манипуляторов и форматирующих методов.
Прапори форматування потоків.
Флаги представляют собой отдельные биты, объединенные в поле x_flags типа long класса ios.С каждым потоком связан набор флагов, которые управляют форматированием потока. Они представляют собой битовые маски, которые определены в классе ios как данные enum-типа fmt_flags. Сами флаги принадлежат типу fmtflags, который определен следующим образом:
typedef int fmtflags ;
Прапори та призначення:
Hex-Значення цілого типа перетворяться як шістнадцятиричні
Dec-Значення цілого типа перетворяться до підстави 10
Oct-Значення цілого типа перетворяться до підстави 8 (як вісімкові)
Fixed-Числа з плаваючою крапкою виводяться у форматі з фіксованою крапкою (тобто nnn.ddd)
Showpos-При виведенні позитивних числових значень виводиться знак плюс
Left-Дані при виводі вирівнюються по лівому краю поля
Right-Дані при виводі вирівнюються по правому краю поля
Stdio-Потоки stdout, stderr очищаються після кожної операції вставки
Прапори left і right взаємно виключають один одного. Прапори dec, oct і hex також взаємно виключають один одного.
Маніпулятори- ще один спосіб форматування потоку. Цей спосіб заснований на використанні маніпуляторів введення-виводу. Маніпулятори введення-виводу є просто виглядом функцій-членів класу ios, які можуть розташовуватися у середині інструкцій введення-виводу.
Манипуляторы делятся на простые, не требующие указания аргументов, и параметризованные. Пользоваться манипуляторами более удобно, чем методами установки флагов форматирования.
Манипуляторы, не требующие указания аргументов:
dec устанавливает при вводе и выводе флаг десятичной системы счисления;
oct восьмеричной системы счисления;
hex …шестнадцатеричной..;
endl при выводе включает в поток символ новой строки и выгружает буфер;
ends при выводе включает в поток нулевой символ;
flush при выводе выгружает буфер.
47. Операції вставки та видалення з потоку.
Вывод в поток выполняется с помощью оператора вставки (в поток), которым является перегруженный оператор сдвига влево « Левым его операндом является объект потока вывода. Правым его операндом может являться любая переменная, для которой определен вывод в поток Например,
For example, инструкция
cout « "Hello!\n";
приводит к выводу в предопределенный поток cout строки
"Hello!".
Оператор « возвращает ссылку на объект ostream, для которого он вызван. Это позволяет строить цепочки вызовов оператора вставки в поток, которые выполняются слева направо.
Оператор вставки в поток поддерживает следующие встроенные типы данных: bool, char, short, int, long, char* расматриваемый как строка), float, double, long double, and void*:
Целочисленные типы форматируются в соответствии с правилами, принятыми по умолчанию, для функции printf() (если они не изменены путем установки различных флагов форматирования). Например, следующие две инструкции дают одинаковый результат:
int i;
long 1;
cout « i « " " « 1;
printf("%d %ld", i, 1);
Тип void* используется для отображения адреса указателя:
int i;
//Отображить адрес ухаЗателя
//в 16-ричной форме.
cout « &i;
Для ввода информации из потока используется оператор извлечения, которым является перегруженный оператор сдвига вправо » Левым операндом оператора » является объект класca istream. Это позволяет строить цепочки инструкций извлечения из потока, выполняемых слева направо. Правым операндом может быть любой тип данных, для которого определен поток ввода.
По умолчанию оператор » пропускает символы - заполнители, затем считывает символы, соответствующие типу заданной переменной. Пропуск ведупщх символов-заполнителей устанавливается специально для этого предназначенным флагом форматирования. пример:
int i;
double d;
cin » i » d;
Последняя инструкция приводит к тому, что программа пропускает ведущие символы-заполнители и считывает целое число i. Затем она игнорирует любые символы-заполнители, следующие за целым числом, и считывает переменную с плавающей точкой d.
Для переменной типа char* (рассматриваемого как строка) оператор » пропускает символы-заполнители и сохраняет следующие за ними символы, пока не появится следующий символ-заполнитель. Затем в указанную переменную добавляется нуль-символ.
49. Файлове введення-виведення з використанням потоків.
Для здійснення операцій з файлами передбачено три класи: ifstream, ofstream і fstream. Ці класи є похідними, відповідно, від класів istream, оstream і iоstream. Оскільки ці класи, у свою чергу, є похідними від класу ios, класи файлових потоків успадковують всі функціональні можливості своїх батьків (функції і прапори форматування, маніпулятори і ін.). Для реалізації файлового введення-виводу потрібно включити в програму заголовний файл fstream.h. .Файловий потік має бути пов'язаний з файлом перш, ніж його можна буде використовувати. зумовлені потоки можуть використовуватися відразу після запуску програми.Можна позиціювати файловий потік в довільну позицію у файлі( для зумовлених потоків це не має сенсу).
Для створення файлового потоку ці класи передбачають наступні форми конструктора:
створити потік, не пов'язуючи його з файлом:
ifstream();
ofstream();
fstream();
створити потік, відкрити файл і пов'язати потік з файлом:
ifstream(const char *name, ios::openmode mode = ios::in);
ofstream(const char* name, ios::openmode mode=ios::out | ios::trunc);
fstream(const char * name, ios::openmode mode = ios::in | ios::out);
Аби відкрити файл для введення або виводу, можна використовувати другу форму потрібного конструктора, наприклад: fstream fs("FileName.dat");
Режими відкриття і їх призначення:
ios::in-Відкрити файл для читання
ios::out-Відкрити файл для запису
ios::ate-Початок виводу встановлюється в кінець файлу
ios::app-Відкрити файл для додавання в кінець
ios::trunc- видалити вміст файлу
ios::binary-Двійковий режим операцій
Режими відкриття файлу є бітовими масками, тому можна задавати два або більш за режим, об'єднуючи їх побітовою операцією АБО. У наступному фрагменті коди файл відкривається для виводу за допомогою функції open():
ofstream ofs;
ofs.open("FileName.dat");
Між режимами відкриття файлу ios::ate і ios::app є невелика різниця.
Якщо файл відкривається в режимі додавання, весь вивід у файл здійснюватиметься в позицію, що починається з поточного кінця файлу, безвідносно до операцій позиціювання у файлі. У режимі відкриття ios::ate можна змінити позицію виводу у файл і здійснювати запис, починаючи з її. Для потоків виводу режим відкриття еквівалентний ios::out | ios::trunc, тобто можна опустити режим усікання файлу. Проте для потоків введення-виведення його потрібно вказувати явно. Файли, які відкриваються для виводу, створюються, якщо вони ще не існують.
Якщо відкриття файлу завершилося невдачею, об'єкт, відповідний потоку, повертатиме 0.
Перевірити успішність відкриття файлу можна також за допомогою функції-члена is_open(), що має наступний прототип:int is_open() const;
Функція повертає 1, якщо потік удалося пов'язати з відкритим файлом. Наприклад
if (!ofs.is_open()){ cout << "Файл не открыт\n"; return; }
Якщо при відкритті файлу не вказаний режим ios::binary, файл відкривається в текстовому режимі і після того, як файл успішно відкритий, для виконання операцій введення-виводу можна використовувати операторів витягання і вставки в потік. Для перевірки, чи досягнутий кінець файлу, можна використовувати функцію ios::eof(), що має прототип int eof();
Завершивши операції введення-виводу, необхідно закрити файл, викликавши функцію-член close() з прототипом void close():
ofs.close();
Закриття файлу відбувається автоматично при виході потокового об'єкту з області існування, коли викликається деструкція потоку.
приклад, що демонструє файлове уведення-виведення з використанням потоків:
#include < iоstream.h >
#include < fstream.h >
void main(){
int n = 50;
// Відкриваємо файл для виводу
ofstream ofs("Test.txt");
if (!ofs) {cout << "Файл не відкритий.\n"; return;}
ofs << "Hello!\n" << n;
// Закриваємо файл
ofs.close();
// відкриваємо той же файл для введення
ifstream file("Test.txt");
if (!file) {cout << "Файл не відкритий.\n";
return;}
char str[80];
file >> str >> n;
cout << str << " " << n << endl;
// Закриваємо файл
file.close();
}