logo
ООП 2012

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; }