- •5)Указатели и ссылки.
- •12) Параметры структурных типов.
- •13) Классы памяти переменных.
- •14) Параметры-функции.
- •15) Правила, определяющие видимость переменных в функциях.
- •16) Пространства имен.
- •19) Функции с параметрами по умолчанию.
- •20) Текстовые файлы. Отличие от Delphi Pascal.
- •Int Pages;
- •Int getPages(); // тело будет описано в book.Сpp
- •18) Перегрузка функций.
- •Int fscanf(file *stream,const char *format[,adress,...]);
- •Int fprintf(file *stream,const char *format[,argument,...]);
- •21) Двоичные файлы. Отличие от Delphi Pascal.
- •22) Определение класса, компоненты класса. Ограничение доступа.
- •23) Инициализация полей при отсутствии конструктора.
- •24) Конструкторы. Инициализация полей при наличии конструктора.
- •25) Деструкторы.
- •27) Простое и множественное наследование классов.
- •28) Наследование. Ограничение доступа при наследовании.
- •29) Конструкторы и деструкторы производных классов.
- •30) Композиция.
- •31)Наполнение
- •32) Полиморфное наследование. Простой полиморфизм.
- •33) Полиморфное наследование. Сложный полиморфизм.
- •34) Статические компоненты классов.
- •35) Особенности работы с динамическими объектами.
- •36) Объекты с динамическими полями. Копирующий конструктор.
- •Void Print(tPoint r) {…}
- •37) Дружественные функции, методы и классы.
- •38) Переопределение операций.
- •39) Шаблоны классов.
- •40) Шаблоны функций.
- •46) Сигналы, слоты и события Qt.
35) Особенности работы с динамическими объектами.
Как и для любой переменной языка C++, объекту некоторого класса память может быть выделена статически - на этапе компиляции или динамически! - во время выполнения программы.
При динамическом распределении память под объект класса выделяется на этапе выполнения из так называемой свободной (динамической) памяти. Причем реальное выделение и освобождение участков осуществляется в момент, определяемый
программистом (при выполнении функций new и delete) и полностью им контролируется.
Различают 3 способа выделения памяти под объект
- статические объекты с динамическими полями;
- динамические объекты со статическими полями;
- динамические объекты с динамическими полями.
Рассмотрим динамические объекты со статическими полями;
Как и на другие типы данных, на объект любого класса можно ссылаться через указатель. При этом значение ему можно присвоить с помощью операции взятия адреса (в этом случае он может адресовать и статический объект). Однако более эффективно использовать указатели для реализации механизма динамического распределения памяти под объект из свободной области. Поскольку типом объекта является некоторый класс, то применительно к объектам используется следующая форма обращения к функции
New:
<имя_указателя_на_объект> = new <имя_класса>;
или
<имя_yкaзaтeля_нa_oбъeкт>=new<имя_клacca>(<cпиcoк_пapaмeтpoв>);
Вторая форма используется при на личии у конструктора списка
параметров.
Функция delete требует указания только имени объекта:
delete <имя указателя на объект>;
Необходимо отметить также особенности работы с динамическими объектами классов, входящих в некоторую иерархию. Как уже отмечалось, C++ позволяет присваивать указателям на базовый класс, значение указателей на любой из производных от него. В этом случае возникают проблемы с доступом к полям объекта, описанным в производном классе:
- указатель на объект базового класса связан с описанием его полей, и поля, описанные в производном классе для него «невидимыми» (рис 1.25). Поэтому при обращении через указатель на базовый класс к полям производного объекта необходимо средствами языка явно переопределить («привести») тип указателя;
- кроме того, если при определении указателя на базовый класс создается
динамический объект производного класса, то во время уничтожения такого объекта вызывается деструктор лишь базового класса и память освобождается не корректно, так как деструктор не может правильно определить размеры освобождаемой памяти. Эта проблема решается применением виртуального деструктора. Если при объявлении деструктора базового класса описать его как virtual, то все конструкторы производного класса так же будут виртуальными. При уничтожении объекта с помощью оператора delete через указатель на базовый класс будут корректно вызваны деструкторы всех
производных классов.
36) Объекты с динамическими полями. Копирующий конструктор.
Наиболее часто динамическое распределение памяти применяют в классах, использующих в качестве полей массивы, строки, структуры и их
комбинации. В этом случае поле содержит указатель на переменную
соответствующего типа. Указатель получает свое значение при вьщелении
памяти под структуру данных, для которой он определен. Освобождение этой
памяти происходит по адресу в указателе в соответствии с типом переменной.
Конструктор такого класса обьгчно осуществляет вьщеление участков
памяти требуемого размера под переменные, адреса которых присваиваются
соответствующим указателям, а также обеспечивает контроль наличия
доступной памяти. Деструктор класса в этом случае должен при уничтожении
объекта освобождать распределенную при конструировании память, так как
по умолчанию эта память не освобождается
Копирующий конструктор:
Автоматически вызывается при операциях:
а) при использовании объявлений типа
TPoint A(2,5),B=A;
б) при передаче параметров-объектов по значению, например:
