Перегрузка операций
Деструкторы
Лекция 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 – служебное слово,
● операция – перегружая операция,