51.Инициализация потоков с помощью конструктора.
Среди функций-членов класса имеются такие, которые определяют особенности создания, инициализации, копирования и уничтожения объектов данного класса. Конструкторы и деструкторы - пример наиболее важных специальных функций-членов. Как и обычные функции-члены, конструкторы и деструкторы могут описываться в пределах или вне класса, конструкторы могут быть "перегружены". Однако, эти функции имеют и ряд особенностей.
Функция-член класса, основная цель которой - инициализация переменных объекта данного класса или/и распределение памяти для их хранения, называется конструктором. Конструктор имеет такое же имя, как и класс, в котором он определен. Конструктор всегда автоматически вызывается при создании объекта любым способом. Этот вызов выполняется, и при входе в блок, где описан объект класса, и при создании объекта по оператору new.
{ Example exm; // есть вызов
Example *pexm; // нет вызова
pexm = new Example; // есть вызов
pexm = (Example *)malloc(sizeof(Example)); // нет вызова
Example *mexm = new Example[10]; // 10 вызовов }
Следует отметить, что для глобальных переменных конструктор вызывается до начала выполнения программы. Таким образом, при ошибке в конструкторе можно получить сбой еще до начала выполнения main-функции, что надо учитывать при трассировке программы.
Например, для класса Student очистка поля ptrStudent могла бы быть внесена в конструктор и исключена из функции addStudent():
class Student
{ ... ... ...
Student() { ptrStudent = NULL; }
}
Если отсутствует явно описанный конструктор (функция-член, имя которой совпадает с именем класса), то С++ генерирует автоматически, так называемый, конструктор по умолчанию (пустую функцию).
Конструктор – это функция, которая строит объект данного класса. Возможны три сценария:
с инициализацией по умолчанию;
со специальной инициализацией;
путём копирования других объектов.
Конструктор не имеет возвращаемого значения, не может быть статическим либо виртуальным.
Классификация конструкторов
Конструктор по умолчанию
Конструктор не имеет аргументов. Если он не определён в классе, то объявляется автоматически и просто выделяет память при создании объекта.
Конструктор с аргументами. Наличие такого конструктора делает определение объекта похожим на вызов функции, на самом деле так и есть, только вызывается конструктор.
Конструктор с аргументами, значение которых задано по умолчанию, так же может быть вызван без аргументов. Это иногда может привести к ошибке при компиляции, так как фактически нельзя распознать конструкторы, если их объявления присутствуют в классе вместе.
Конструкторы должны отличаться числом или типом переменных, что даёт возможность строить гибкие классы, чтобы упростить программирование.
Конструктор копирования
Часто нужно просто создать объект такой же, как этот, то есть получить копию существующего.
Class Counter{
int Value;
public:
Counter(int =0) //Принимает целое или обнуляется
Counter(Counter&); //Ссылка };
Counter:: Counter(Counter& ref){
Value=ref.Value; }
void main(){
Counter object(5);//Используется конструктор для int
Counter object1=object;//Копирование }
Копирование объектов обычно производится при передаче объектов по значению в функцию или из неё.
Void report_count(Counter object){
printf(“\n The object count is % ld”,object.GetValue());}
void main(){
Counter object(10);
Report_count(object); }
Counter get_an_object(){
Static Counter object(30); return object; }
void main(){
Counter object = get_an_object(); }
Конструктор с подобъектами
Подобъект, это объект класса, объявленный внутри класса.
Конструктор включающего класса должен вызвать конструкторы подобъектов
Class Counter{
int Value;
public: Counter(){Value=0;};
class Example{
int Value; public:
Counter cars; //Подобъект
Example(){Value=0;}
}; };
void main(){ Example e;)}
Конструкторы подобъектов вызываются в том порядке, в каком подобъекты появляются в объявлении класса:
Example::Example() вызовет Counter:: Counter(), он выполнится и после этого выполнится Example().
Приватные конструкторы
Не допускают создания объекта класса обычными способами. Они требуют одного из условий:
вызов статическим членом класса;
вызов дружественным классом
существующий объект класса имеет функцию-член, которая вызывает конструктор для создания нового объекта.
Class Counter{
Counter(); //приватный конструктор };
Counter object; //Ошибка – создание глобального объекта
Static Counter counter; // Ошибка – создание статического объекта
Void main(){
Counter object; // Ошибка – создание автоматического объекта
- 99. Типы диаграмм языка uml
- 98. Унифицированный язык моделирования uml.
- 100. Диаграмма классов (class diagram).
- Концептуальная точка зрения — диаграмма классов описывает модель предметной области, в ней присутствуют только классы прикладных объектов;
- Точка зрения спецификации — диаграмма классов применяется при проектировании информационных систем;
- Точка зрения реализации — диаграмма классов содержит классы, используемые непосредственно в программном коде (при использовании объектно-ориентированных языков программирования).
- 102. Компонентно-ориентированное проектирование
- Объектно-ориентированное проектирование на основе иерархии классов.
- 93. Гетерогенные контейнеры adt шаблонов
- Компонентные классы как основа систем визуального программирования.
- Построение каркасов приложений в среде современных систем программирования.
- Производные классы: наследование.
- Термин наследование и применение к классам и их характеристикам
- Создание объекта производного класса.
- Расширение производного класса.
- Создание объекта производного класса и вызов конструкторов
- Производные классы: полиморфизм.
- Множественное наследование в классе, порождённом от нескольких родительских классов-предков.
- Производные классы: полиморфная функция
- Иерархия классов
- 39.Простые манипуляторы для управления потоком
- Прядок вызова конструкторов в производных классах
- Виртуальные базовые классы.
- Порядок построения виртуальных базовых классов.
- 25. Указатель на абстрактный класс.
- 28.Технология объектно-ориентированного программирования.
- Интерфейс пользователя и абстрактный класс.
- 35.Предопределенные объекты-потоки.
- 29. Применение шаблонов классов и шаблонов функций.
- 30.Объекты класса и указатели на объекты класса.
- 31.Члены данных объекта и указатели на члены данных класса.
- 32.Указатели на функции-члены класса и указатели на статические члены данных.
- 36.Стандартный ввод-вывод.
- 34.Создание и организация взаимодействие потоков ввода-вывода.
- 37.Методы позиционирования потоков.
- 38.Способы управления форматом выходных данных.
- 42.Организация ввода-вывода для пользовательского типа
- 40.Параметризованные манипуляторы и форматирующие функции.
- 41.Состояния потока.
- 43.Методы опроса и установки состояния потока.
- 44.Обработка ошибок в потоке через определение и установку состояния потока.
- 45.Последовательность действий при создании ostream.
- 46.Открытие и закрытие файла.
- 47.Методы ввода-вывода.
- 13.Преобразование типов в производных классах.
- 14.Разрешение области видимости в производных классах
- 15.Виртуальные функции.
- 16.Нестатические компонентные функции класса.
- 17.Применение виртуальных функций.
- 18.Вызов виртуальных функций в конструкторе.
- 19.Вызов полиморфных функций базового класса.
- 20.Вызов полиморфных функций через базовые классы.
- 21.Вызов виртуальной функции через таблицу виртуальных методов.
- 22.Ограничения на использование виртуальных функций.
- 23.Чистая виртуальная функция.
- 24.Абстрактный класс и его использование.
- 80.Контейнер объектов List
- 82.Контейнеры шаблонов fds (Fundamental Data Structures).
- 76.Класс итераторов объектов: внешние и внутренние итераторы.
- 81.Контейнер объектов Stack
- 71.Контейнерные классы объектов: понятие контейнерного класса.
- 72.Итераторы в контейнерных классах объектов как друзья класса.
- 48.Бинарные файлы.
- 49.Чтение бинарных файлов.
- 50.Запись в бинарные файлы.
- 51.Инициализация потоков с помощью конструктора.
- 52.Текстовые файлы для ввода-вывода.
- 60.Дружественные шаблоны.
- 53.Форматирование в памяти с использованием потоков strstream.
- 54.Шаблон класса.
- 69.Механизм обработки исключений.
- 56.Создание шаблонного класса.
- 57.Шаблон функции, объявление.
- 61.Функциональное замыкание при разработке приложений.
- 58.Запись шаблона функции с несколькими обобщенными аргументами.
- 65.Исключение как статический объект.
- 64.Объектно-ориентированный подход к обработке исключений.
- 66.Генерации исключения.
- 85.Гомогенные и гетерогенные контейнеры шаблонов fds.
- 63.Использование конструкторов и деструкторов в роли «вступления» и «заключения».
- 67.Операторы throw и catch.
- 68.Обработчик исключений.
- 70.Понятие контролируемого блока при обработке исключений.
- 84.Способы хранения элементов в контейнерах шаблонов fds.
- 83.Вектора и списки в контейнере шаблонов.
- Стандартные контейнеры библиотеки stl
- 86.Fds контейнеры шаблонов векторов
- 62.Функциональное замыкание через наследование.
- 87.Fds контейнеры шаблонов списков
- 89.Способы реализации и префиксы имен adt-контейнеров шаблонов.
- 88.Контейнеры шаблонов adt (Abstract Data Types) и их классификация.
- 90.Типы adt-контейнеров шаблонов.
- 91.Массивы adt-контейнеров шаблонов.
- 92.Стеки adt-контейнеров шаблонов.
- 78.Контейнер объектов Array
- 74.Класс контейнеров объектов: разбиение контейнеров на группы.
- 77.Иерархия классов итераторов объектов
- 79.Контейнер объектов SortedArray
- 73.Библиотека контейнерного класса структур данных.