25) Деструкторы.
Деструкторы аналогично конструкторам вызываются автоматически, но в момент освобождения памяти, выделенной под объект. Деструкторы обычно используют для освобождения памяти, выделенной под динамические поля объектов.
26) Инициализация полей объектов при наличии и отсутствии конструктора.
В программе, использующей классы, по мере необходимости объявляют объекты этих классов.
Объекты – переменные программы, соответственно на них распространяются общие правила длительности существования и области действия переменных, а именно:
· внешние, статические и внешние статические объекты создаются до вызова функции main() и уничтожаются по завершении программы;
· автоматические объекты создаются каждый раз при вызове функции, в которой они объявлены, и уничтожаются при выходе из нее;
· объекты, память под которые выделяется динамически, создаются оператором new и уничтожаются оператором delete.
При объявлении полей в описании класса не допускается их инициализация, поскольку в момент описания класса память для размещения его полей еще не выделена.
Выделение памяти осуществляется не для класса, а для объектов этого класса, поэтому возможность инициализации полей появляется только во время или после объявления
объекта конкретного класса.
Объявление объектов и способы инициализации их полей зависят от наличия или отсутствия в классе специального инициализирующего метода – конструктора, а также от того, в какой секции класса описано инициализируемое поле.
Если в классе отсутствует конструктор, но описаны защищенные protected или скрытые private поля, то возможно создание только неинициализированных объектов.
Для этого используется стандартная конструкция объявления переменных или указателей на них. Например:
First a, // объект класса First
*b, // указатель на объект класса First
c[4]; // массив с из четырех объектов класса First
При объявлении указателя, как и для обычных переменных, память под объект не выделяется. Это необходимо сделать отдельно, используя операцию new, после работы с динамическим объектом память необходимо освободить:
b=new First; ... delete b;
Объект, созданный таким способом, называют динамическим.
Значения полей неинициализированных статических и динамических объектов или массивов объектов задают в процессе дальнейшей работы с объектами: защищенных и скрытых – только в методах класса, а общедоступных – в методах класса или непосредственным присваиванием в программе.
При отсутствии в классе конструктора и защищенных protected или скрытых private полей для объявления инициализированных объектов используют оператор инициализации, применяемый при создании инициализированных структур, например:
First a = {'A',3,4},
c[4] = {{'A',1,4},{'B',3,5},{'C',2,6},{'D',1,3}};
Инициализирующие значения при этом должны перечисляться в порядке следования полей в описании класса.
Обращение к общедоступным полям и методам объекта из программы.
Обращение к общедоступным полям и методам объекта из программы может осуществляться с помощью полных имен, каждое из которых имеет вид
<Имя объекта> . <Имя класса> :: <Имя поля или функции> ;
Например:
a.First::set('A',3,4); // статический объект
b->First::set('B',3,4); // динамический объект
c[i].First::set('C',3,4); // массив объектов
Однако обычно доступ к компонентам объекта обеспечивается с помощью укороченного имени, в котором квалификатор доступа опущен, тогда принадлежность к классу определяется по типу объекта:
<Имя объекта>.<Имя поля или функции>
<Имя указателя на объект> -> <Имя поля или функции>
<Имя объекта>[<Индекс>].<Имя поля или функции>
Например:
а.x b->x c[i].x
a.set('A',3,4) b->set('B',3,4) c[i].set('C',3,4)
Первая строка демонстрирует обращение к общедоступным полям простого объекта, динамического объекта и элемента массива объектов. Вторая строка – обращение к общедоступным методам соответствующих объектов.
Конструктор – метод класса, который а в т о м а т и ч е с к и вызывается при выделении памяти под объект.
По правилам С++ конструктор имеет то же имя, что и класс, не наследуется в производных классах, может иметь аргументы, но не возвращает значения, может быть параметрически перегружен.
class Num
{
int n;
public:
Num(int an){ cout<<"Конструктор"<<endl; n=an; }
- 5)Указатели и ссылки.
- 12) Параметры структурных типов.
- 13) Классы памяти переменных.
- 14) Параметры-функции.
- 15) Правила, определяющие видимость переменных в функциях.
- 16) Пространства имен.
- Int Pages;
- Int getPages(); // тело будет описано в book.Сpp
- 18) Перегрузка функций.
- 19) Функции с параметрами по умолчанию.
- 20) Текстовые файлы. Отличие от Delphi Pascal.
- 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.