Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
c_1_po_16.docx
Скачиваний:
5
Добавлен:
06.12.2018
Размер:
71.4 Кб
Скачать

8) Деструкторы

Деструктор — это особый вид метода, применяющийся для освобождения памяти,

занимаемой объектом. Деструктор вызывается автоматически, когда объект

выходит из области видимости:

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

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

• для объектов, заданных через указатели^ деструктор вызывается неявно при

использовании операции delete.

При выходе из области действия указателя на объект автоматический вызов деструктора

объекта не производится.

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

имя класса. Деструктор:

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

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

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

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

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

пустой деструктор.

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

содержит указатели на память, выделяемую динамически ~ иначе при уничтожении

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

как свободная. Указатель на деструктор определить нельзя.

Пример

#include <iostream>

using namespace std;

class NameOfClass

{

private:

int a;

public:

NameOfClass(int m);

~NameOfClass();

};

NameOfClass::~NameOfClass() (ДЕСТРУТОР)

{

cout << this->a << endl;

}

NameOfClass::NameOfClass(int m)

{

a = m;

}

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

Перегрузкой называется практика придания нескольких значений оператору или функции. Выбор конкретного значения зависит от типов аргументов, полученных оператором или функцией. Большинство операторов С++ может быть перегружено. Часто используют перегрузку оператора + (например, для представления конкатенации строк).

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

 Перепишем определение класса Complex:

// определение класса комплексных чисел

class Complex

{

public:

int real; // вещественная часть

int imaginary; // мнимая часть

// прибавить комплексное число

Complex operator+(const Complex x) const;

};

Вместо метода Add появился метод operator+. Изменилось и его определение. Во-первых, этот метод возвращает значение типа Complex ( операция сложения в результате дает новое значение того же типа, что и типы операндов). Во-вторых, перед аргументом метода появилось ключевое слово const. Это слово обозначает, что при выполнении данного метода аргумент изменяться не будет. Также const появилось после объявления метода. Второе ключевое слово const означает, что объект, выполняющий метод, не будет изменен. При выполнении операции сложения x + y над двумя величинами x и y сами эти величины не изменяются. Теперь запишем определение операции сложения:

Complex

Complex::operator+(const Complex x) const

{

Complex result;

result.real = real + x.real;

result.imaginary = imaginary + x.imaginary;

return result;

}

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