Программирование >>  Программирование на языке c++ 

1 ... 36 37 38 [ 39 ] 40 41 42 ... 159


Здесь при каждом вызове функции function сначала конструируется объект X, а затем объект Y. Когда осуществляется возврат (выход) из функции function (т. е. функция function завершается), то деструкторы выполняются в обратном порядке: сначала для объекта Y, а потом для объекта X (см. пример 2).

Конструкторы для глобальных статических объектов выполняются в последовательности, совпадающей с последовательностью объявлений соответствующих объектов (см. пример 3). Деструкторы, как и выше, вызываются в обратном порядке. Конструктор для локального статического объекта выполняется один раз при первом описании этого статического объекта (см. пример 4). Деструктор для локального статического объекта выполняется один раз при завершении программы. Вызов конструкторов и деструкторов для статических объектов в языке C-I-+ делает возможным решение очень важной задачи - инициализации данных в структурах библиотечных классов [1,16].

Если программа завершается вызовом функции exit(), то деструкторы для сконструированных ранее объектов будут вызваны (см. пример 4). Однако если программа завершается вызовом функции abcrtO, то деструкторы не будут вызваны (см. пример 4).

Если объекты создаются при помощи оператора new, то память для них будет выделена динамически в свободной области памяти (см. пример 5). Это поясняется в следующем фрагменте программы:

class my class {

public:

my class(...); это конструктор

void function(void)

{ my class* p1=new my class(...); конструктор для pi my class* p2=new my class(...); конструктор для p2 delete pi; деструктор для pi delete p2; деструктор для p2



Здесь сначала выполняется конструктор для р1 (для объекта, на который указывает р1), затем конструктор для р2, далее деструктор для р1 и, наконец, деструктор для р2.

Если объект является компонентом другого класса, то конструктор для этого объекта можно вызвать при вызове конструктора для внешнего класса (см. пример 6). Это поясняется в следующем фрагменте программы:

class my class in {

public:

my class in(...); это конструктор

class my class out (

my class in object 1; первый вложенный объект my class in object2; второй вложенный объект

public:

my class out(...); это конструктор

Теперь проблема заключается в том, как вызвать конструкторы объектов object 1 и object2 и как передать аргументы в эти конструкторы. Это можно сделать, поместив вызовы соответствующих конструкторов объектов object 1 и object2 в описание конструктора my class out их класса, например:

my class out::my class out(...) : object 1(...), object2{...)

описание конструктора my class out

Здесь использована следующая форма записи:

имя класса :: имя конструктора : через запятую список компонентов класса, которые надо инициализировать { описание тела конструктора }

Покажем, как передать параметры в конструкторы objectl и object2.



class my class in { int b;

public:

my class in(int); конструктор с одним параметром

class my class out { my class in object 1; my class in object2;

public:

my class out(int a); конструктор с одним параметром

my class out::my class out(int а) : object1(a), object2(a)

описание конструктора my class out

Конструкторы будут вызываться в том порддке, в котором соответствующие объекты объявлены в классе.

Точно так же можно инициализировать и другие компоненты-данные класса, например:

my class out::my class out(int а) : object1(a), object2{a), b(a)

описание конструктора my class out

Теперь, после инициализации, Ь=а и а - это значение параметра, который передается в конструктор my class out при объявлении объекта класса my class out, например:

my class out ob(100);

Здесь строится объект ob класса my class out и в конструктор для этого объекта передается значение 100 (т. е. а=100).

Если конструктор объекта, объявленого в классе, не имеет аргументов, то объект можно удалить из инициализирующего



1 ... 36 37 38 [ 39 ] 40 41 42 ... 159

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика