Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AllCandC++Lectures.docx
Скачиваний:
2
Добавлен:
25.09.2019
Размер:
52.56 Кб
Скачать

Конструкторы и деструкторы

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

class test {

Int i, y;

Test t; //будет вызван конструктор по умолчанию

Test() {} - конструктор по умолчанию.

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

Новые объекты инициализируются, когда определяется переменная на локальном или глобальном уровне, при явном выполнении операции new, при явном вызове конструктора. Кроме того временный объект может создаваться при вызове функции или объект может создаваться как часть другого объекта. Аргументом конструктора не может быть объект того же класса ( ссылка может быть).

В классе может быть определен один деструктор, который вызывается при разрушении объектов. Имя деструктора: ~Test() {}. Он не имеет аргументов и возвращаемого значения. Если деструктор в классе не определен, то используется деструктор по умолчанию.

Варианты синтаксиса инициализации объектов

Так как СИ++ является надстройкой над СИ, то сохранен вариант инициализации с равенством. Если инициализирующих значений несколько, то они перечисляются в скобках через запятую. Пустые скобки запрещены. Массив: a[5]={2,3,4}.

Статические члены-данные

В СИ++ static может применяться в более широком смысле, чем в СИ. Например, в СИ статическим не может быть объявлено отдельное поле структуры. В СИ++ статическими могут быть члены-данные структуры классов. Однако, в отличие от СИ, объявление в классе статического поля данных, не приводит к автоматическому выделению памяти и обнулению. Особенностью статических членов данных является то, что они являются общими для всех объектов классов, то есть, если обычное поле данных создается заново для каждого объекта, то статические поля создаются только один раз. Но при этом они остаются доступными всем объектам. Статические поля данных можно рассматривать как данные класса, а не данные объекта. Их необходимо специальным образом создавать и инициализировать. Конструкторы для этой цели не подходят, потому что они вызываются при создании каждого объекта. А статические поля создаются один раз. Так как статические поля принадлежат классу, то с одной стороны их можно рассматривать как свойства объекта, а с другой стороны к ним можно обращаться напрямую, то есть без использования объекта. Инициализация статических полей класса выполняется на глобальном уровне. Имя класса необходимо для того, чтобы указать конкретно, откуда берется поле j. Инициализация выполняется только один раз, на глобальном уровне. Доступ к статическим полям выполняется двумя способами: либо через точку: x.j, но для этого нужен объект x, либо непосредственно через имя класса. Если статические поля классов инициализированы, то к ним можно обращаться еще до того как был создан первый объект этого класса. Создаются эти поля (выделяется память) в момент инициализации.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]