Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
369164_46F07_otvety_na_bilety_po_oop_si.doc
Скачиваний:
44
Добавлен:
24.12.2018
Размер:
613.38 Кб
Скачать

23. Классы, содержащие объекты других классов

Элементы - данные некоторого класса могут быть объектами других классов, содержащих свои конструкторы и деструкторы.

В объектно-ориентированной методологии известно такое понятие HASA relationship.

Инициализация элементов-объектов осуществляется через список инициализации (constructor initializer).

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

имя_члена (список аргументов).

Список аргументов должен соответствовать какому-нибудь из конструкторов класса к которому он принадлежит. Именно этот конструктор и будет вызываться для таких членов-объектов класса.

// класс с объектами-членами другого класса

class A {

........... public: A(int n=0) {...}; ~A() {...};

};

class B {

........... public: B(double x=0) {...}; ~B() {...};

};

class D { const A a; B b;

public: D(double x,int i); D(double x); D(); ~D();

};

// реализация

D::D(double x,int i):b(x),a(i)

{ ....... }

D::D(double x):b(x) { ....... }

D::D():b(0) { ....... }

В этом примере класс D создает два объекта классов A и B. Для инициализации a и b используется список инициализации. При использовании классов агрегатов следует учесть, что конструкторы членов-объектов класса вызываются раньше, чем для класса владельца.

Порядок вызовов конструкторов членов-класса определяется не списком инициализации, порядком объявления переменных класса.

В нашем случае D с двумя переменными первым будет вызывать конструктор объекта a.

Если конструктору члена-класса аргументы не нужны, то этот объект можно не указывать в списке инициализации. Конструктор будет вызван по умолчанию

Аргументы объектов в списке инициализации могут быть сколь угодно сложными.

Список инициализации членов является единственным способом инициализации константных объектов членов-класса, ссылок, объектов с защищенными данными.

24. Создание объектов с различным временем жизни

Если программист не указал иного, то объект создается, когда встречается его описание, и уничтожается, когда его имя выходит из области видимости.

Время жизни объектов определяется классом памяти.

Статические объекты создаются и инициализируются на момент запуска программы в сегменте данных и существуют до ее остановки, не меняя своего месторасположения в памяти. Конструкторы таких объектов называются цельными. Конструкторы для статических объектов могут вызываться до main(). Деструкторы вызываются по окончании программы в порядке обратном вызове конструкторов.

Автоматические объекты создаются и инициализируются в стеке в момент входа в блок и завершают свое существование при выходе из блока. Конструктор для автоматических объектов вызывается неявно при каждом определенном входе в блок или в функцию. Деструктор для каждого автоматического объекта также вызываются неявно, при выходе из блока или функции, но в порядке обратном вызову конструкторов.

В стеке могут создаваться временные объекты. Порядок вызова таких функций определяется порядком вычислений. Деструкторы для них вызываются по окончании операции, в которой потреблялись временные объекты.

Динамические данные создаются в куче. Нужно создавать с помощью new и delete. Опер. new кроме выделения памяти осуществляет вызов соответствующего конструктора, обеспечивая необходимую инициализацию объектов. delete кроме освобождения памяти вызывает деструктор, который может корректно завершить работу с объектом.

Point2D p1=new Poinr2D(5.5,10.1);

................................

delete p1;

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