|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Деструкторы
Кроме специального метода конструктор, который вызывается при создании объекта, существует другой особый метод, автоматически вызываемый при уничтожении объекта, называемый деструктором. Деструктор имеет имя, совпадающее с именем конструктора, перед которым стоит тильда ~. class Prim { private: int dat; public: Prim(): dat(0) { } ~Prim() { } }; Наиболее распространённое применение деструкторов – освобождение памяти, выделенной конструктором при создании объекта. Определение методов может быть реализовано как внутри самого класса, так и вне класса. Во втором случае внутри класса содержится лишь прототип функции, а сама функция определяется позже. Тогда перед именем функции указывается имя класса и символ :: Вернемся к примеру класса TPoint. Рассмотрим в этом примере реализацию метода relmove()вне класса и добавим деструктор для класса TPoint. class TPoint { private: int x,y; public: TPoint(int newx, int newy) {x=newx;y=newy; } void relmove (int dx, int dy); int getx (void) { return x; } int gety (void) { return y; } ~Tpoint(){ } }; void TPoint::relmove(int dx, int dy) {x+= dx; y += dy; } ЗАМЕЧАНИЯ: 1)Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации. 2)Конструктор, вызываемый без параметров, называется конструктором по умолчанию. 3)Деструктор вызывается автоматически, когда объект выходит из области видимости: • для локальных объектов — при выходе из блока, в котором они объявлены; • для глобальных — как часть процедуры выхода из main(); • для объектов, заданных через указатели деструктор вызывается неявно при использовании операции delete. Деструктор: • не имеет аргументов и возвращаемого значения; • не может быть объявлен как const или static; • не наследуется; • может быть виртуальным. Вернемся к второму пример, где был создан класс Counter. При решении разных задач может возникнуть необходимость инициализации счетчика разными значениями, а не только нулем. Для этого создадим еще один конструктор: class Counter { private: int count; public: Counter ():count(0)//конструктор, инициализирующий нулем { } Counter (int c): count(c)//конструктор задает любое нач. значение { } void inc_count () {count++; } int get_count() { return count; } ~Counter(){} //деструктор }; int _tmain(int argc, _TCHAR* argv[]) { Counter c1, c2(3); std::cout<<c1.get_count()<<std::endl; std::cout<<c2.get_count()<<std::endl; c1.inc_count(); c2.inc_count(); std::cout<<c1.get_count()<<std::endl; std::cout<<c2.get_count()<<std::endl; return 0; } Результат работы программы приведен на рисунке 2.4. Рисунок 2.4. – Результат работы программы с разными начальными значениями счетчиков Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.) |