Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP.doc
Скачиваний:
7
Добавлен:
25.04.2019
Размер:
1.34 Mб
Скачать

CString(const char *);

может осуществлять преобразование строк в стиле С в объекты класса CString. Если записать

CString O = “строка”;

то константа «строка» будет преобразована в объект класса CString подходящим по типу конструктором этого класса.

Подобные неявные преобразования типов часто негативно влияют на качество кода (например, из-за них могут возникать нежелательные временные объекты), поэтому нужен способ их запрещения. Запретить использование конструктора для неявных преобразований типов можно путем придания конструктору атрибута explicit. Этот атрибут сообщает компилятору о том, что конструктор может применяться только для явного создания объектов, а все неявные преобразования типов на его основе нужно считать ошибкой. Атрибут explicit имеет смысл только для общих конструкторов, которые могут быть вызваны с одним аргументом. К их числу относятся, к примеру, такие, у которых более одного параметра, но все они, исключая первый, имеют значения по умолчанию.

Ниже в качестве примера приведен общий конструктор для класса CSqMatrix, который описывает квадратные матрицы. В конструкторе первый параметр задает размер матрицы, а второй определяет: нужно ли при создании матрицы обнулять ее элементы (по умолчанию элементы матрицы обнуляются).

explicit CSqMatrix(size_t size, bool zero = true);

Как только объект становится не нужен в программе, его целесообразно уничтожить. Локальные объекты уничтожаются автоматически при выходе из соответствующей сферы действия. Статические объекты также удаляются автоматически, но после завершения программы в целом. Динамические объекты автоматически не уничтожаются – их надо удалять явно с помощью операции delete (для массива объектов – операции delete[])2.

Когда объект уничтожается, вызывается его деструктор. Деструктор, так же как и конструктор, является компонентной функцией класса, но в отличие от конструктора может быть в классе только один. Основная задача деструктора – выполнить завершающие действия в ходе удаления объекта, например, освободить память, выделенную объектом (если, к примеру, один из компонент класса является динамическим массивом, то его удаление при уничтожении объекта – задача деструктора)3. Определяется деструктор следующим образом:

~class_id() {/*statements*/}

Деструктор не имеет параметров и не должен возвращать никаких значений. Имя его должно совпадать с именем класса class_id. Причем к имени обязательно дописывается префикс «тильда». Деструктор, подобно любой компонентной функции класса, может иметь внутреннее или внешнее определение. На операторы тела деструктора не накладываются ограничения.

Деструктор может быть вызван явно или неявно. Явный вызов деструктора – явление довольно редкое; как правило, деструктор вызывается неявно, например, когда управление выходит из сферы действия объекта, автоматически вызывается его деструктор. Если при уничтожении объектов не надо решать никаких задач, то деструктор можно вообще не определять. Однако следует помнить, что в этом случае компилятор автоматически создаст деструктор.

Ниже приведен пример внешнего определения деструктора для класса CMatrix, описывающего прямоугольные матрицы (здесь __nrows – число строк матрицы, а __thematrix – указатель на ее элементы).

Пример

CMatrix::~CMatrix() {

for(size_t i = 0; i < __nrows; i++) delete[] __thematrix[i];

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