Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Итоговый конспект Тельнов.docx
Скачиваний:
10
Добавлен:
07.04.2023
Размер:
7.75 Mб
Скачать

37. Деструкторы. Их назначение, примеры.

Деструктором называетcя функция-член класса, которая всегда вызывается при завершении существования объектов класса. Назначение деструктора освободить полученные ресурсы, закрыть файлы, др. Имя деструктора должно начинаться со значка «~»(тильда) и в остальном совпадать с именем класса.

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

Class A1: {………. public: virtual ~A1 () ; } ; // класс А1

Class A2: public A1 {………. public: virtual ~A2 () ; } ; //класс А2

Class A3: public A2 {………. public: virtual ~A3 () ; } ; //класс А3

//создадим три объекта классов и посмотрим на работу их деструкторов

void main ( void ) {

A1 *p [3]; //массив указателей на объекты классов

p[0]=new A1; //создадим объект класса А1

p[1]=new A2; //создадим объект класса А2

p[2]=new A3; //создадим объект класса А3

delete p[1]; // порядок вызова деструкторов: ~A2(); ~A1();

delete p[2]; } ; // порядок вызова деструкторов: ~A3(); ~A2();~A1();

38. Перегруженные операции. Формализм на языке С++.

С++ позволяет переопределять большинство операций языка так, чтобы при использовании с объектами конкретных классов эти операции выполнялись специфически образом, через специально заданные функции.

Конкретно, можно перегружать следующие операции языка: + - * / % ^ & | ~ ! = += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- ->* , -> [] () new delete

Последние четыре операции означают: индексацию, вызов функции, размещение в динамической памяти и освобождение памяти.

Для дальнейшего изложения обозначим @ - некоторую перегружаемую операцию языка С++. Пусть х и у – объекты некоторых классов С++.

Перегрузка унарных операций.

@x – унарная операция над объектом х в префиксной форме интерпретируется как вызов функции-члена

x.operator@() без аргументов

или вызов friend-функции с именем

operator@(x) с одним аргументом.

x@ - унарная операция над объектом х в постфиксной форме интерпретируется как вызов функции члена

x.operator@(int) , где аргумент типа int – фиктивный

или вызова friend-функции с именем

operator@(x, int), где аргумент типа int – фиктивный.

Перегрузка бинарных операций.

x@y – бинарная операция с объектами х и у интерпретируется как вызов функции-члена

x.operator@(y) с одним аргументом

или вызов friend-функции с именем

operator@(x, y) с двумя аргументами.

Замечания к перегруженным операциям.

  • При перегрузке операций, полностью сохраняется синтаксис языка С++в том числе приоритет и порядок выполнения операций.

  • Можно перегрузить операции new и delete и начать самостоятельно управлять процессами выделения и освобождения динамической памяти.

  • Можно перегрузить операцию индексации []. Индексы могут иметь любой тип (например, цвет, текст, др.). Это есть ассоциативные массивы.

  • Итераторы в контейнерах можно заменить «умными» перегруженными операциями «++» и «--», которые при обходе не позволяют выйти за пределы контейнера.

  • Можно переопределить операцию косвенной адресации объекта «->» для работы с умными указателями, которые при каждом обращении к объекту будут выполнять любую заданную им работу.

  • Можно перегрузить операцию вызова функции, тогда запись вида <объект> ( <список-аргументов>) будет рассматриваться как бинарная операция operator() (…).

  • Можно перегрузить операцию преобразования типа (собственный кастинг).