АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Деструкторы

Читайте также:
  1. Абстрактные классы и чистые виртуальные функции. Виртуальные деструкторы. Дружественные функции. Дружественные классы.
  2. Деструкторы
  3. Конструкторы и деструкторы
  4. Конструкторы и деструкторы. Автоматическая инициализация. Список инициализации элементов.

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

Деструктор имеет имя, совпадающее с именем конструктора, перед которым стоит тильда ~.

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. – Результат работы программы

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


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.)