Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЕКЦИИ Программирование и основы алгоритмизации...doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.5 Mб
Скачать

Шаблон класса для статически и динамически создаваемых объектов

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

Шаблонный класс dyn, имеющий статический и динамический данные-элементы

//----------------------------------------------------------------------------------------------

#include <iostream.h>

template<class T>

class dyn {

public:

dyn(const T& m1, const T& m2); //конструктор 1

dyn(const dyn<T>& x); // конструктор 2

~dyn(); //деструктор

//перегруженная операция присваивания

dyn<T>& operator=(const dyn<T>& r);

private:

T mem1;

T* mem2;

};

//----------------------------------------------------------------------------------------------

Примечание. Если имя шаблонного класса используется как тип, то нужно добавлять <T> в конец имени класса.

Конструктор 1

Этот конструктор использует параметр m1 для инициализации статического элемента данных mem1. Для данного-элемента *mem2 требуется выделение памяти типа T и инициализация её значением m2.

//----------------------------------------------------------------------------------------------

template <class T>

dyn<T>::dyn(const T& m1, const T& m2)

{ mem1=m1;

Mem2=new T(m2);

cout<<”Конструктор: ”<<mem1<<’|’<<*mem2<<endl;

}

//-----------------------------------------------------------------------

Примеры использования конструктора

1) dyn<int> statoby(1,100); //вызов конструктора

2) dyn<int>* dynobj;

dynobj=new dyn<int>(2,200); //вызов конструктора

При создании объекта *dynobj конструктор класса инициализирует данные-элементы переданными ему значениями 2 и 200.

Деструктор

Рассмотрим функцию:

void dd(int m1, int m2)

{ dyn<int> obj(m1, m2); }

Функция создает объект obj, инициализированный m1и m2. При возвращении из dd объект obj уничтожается, однако динамическая память, связанная с объектом, не освобождается.

до удаления obj

Для эффективного управления памятью необходимо освобождать динамические данные объекта в то же самое время, когда уничтожается объект. Для этого нужно выполнить действия конструктора в обратном порядке, что и делает функция-элемент деструктор: ~dyn(); “~” – дополнение (конструктора). Деструктор не имеет параметра и возвращаемого значения и автоматически вызывается при уничтожении объекта.

//----------------------------------------------------------------------------------------------

template <class T>

dyn<T>::~dyn()

{ cout<<”Деструктор: ”<<mem1<<’|’<<*mem2<<endl;

delete mem2;

}

//----------------------------------------------------------------------------------------------

Вызовы конструкторов и деструкторов

void main()

{ dyn<int> ob1(1,100), // вызов конструктора для ob1(1,100)

*ob2;

ob2=new dyn<int>(2,200); //вызов конструктора для *ob2(2,200)

dd(3,300); //вызов конструктора, а затем, при выходе из dd,

//деструктора для локального объекта

delete ob2; //вызов деструктора для*ob2

} //вызов деструктора для ob1.