Перегрузка операций

Деструкторы

Лекция 4. Деструкторы. Перегрузка операций

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

· для локальных объектов – при выходе из блока, в котором они объявлены;

· для глобальных – как часть процедуры выхода из main;

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

 

Имя деструктора начинается с тильды (~), непосредственно за которой следует имя класса. Деструктор:

· не имеет аргументов и возвращаемого значения;

· не может быть объявлен как const или static;

· не наследуется;

· может быть виртуальным.

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

Описывать в классе деструктор явным образом требуется в случае, когда объект содержит указатели на память, выделяемую динамически – иначе при уничтожении объекта память, на которую ссылались его поля-указатели, не будет помечена как свободная.

Деструктор для рассмотренного примера в Лекции 3 должен выглядеть так:

prostr:: ~prostr()

{

for(int i=0;i<k;i++)

delete[] a[i];

delete[] a;

}

Деструктор можно вызвать явным образом путем указания полностью уточненного имени, например:

prostr p; ...

p.~ prostr();

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

 

В С++ существует возможность перегрузки операции внутри класса, например, можно добиться того, что операция * при работе с матрицами осуществляла умножение матриц, а при работе с комплексными числами – умножение комплексных чисел.

Для перегрузки операций внутри класса нужно написать специальную функцию – метод класса. При перегрузке операций следует помнить следующее:

• при перегрузке нельзя изменить приоритет операций;

• нельзя изменить тип операции (из унарной операции нельзя сделать бинарную или наоборот);

• перегруженная операция является членом класса и может использоваться только в выражениях с объектами своего класса;

• нельзя создавать новые операции;

• запрещено перегружать операции: .(доступ к членам класса), унарную операцию *(значение по адресу указателя), ::(расширение области видимости) , ?: (операция if);

• допустима перегрузка следующих операций: +, -, *, /, %, =, <, >, +=, -=, *=, /=, <, >, &&, ||, ++,

--, (), [], new, delete.

Для перегрузки операции необходимо создать функцию-метод:

тип operator операция (список параметров) { тело функции }

здесь

● тип – тип возвращаемого операцией значения,

● operator – служебное слово,

● операция – перегружая операция,