Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
EKZAMEN_PO_INFORMATIKE_TEORIYa_1.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
260.1 Кб
Скачать

25)Деструкторы. Дружественные функции и классы.

Деструктор.

Метод-деструктор вызывается автоматически, когда его объект выходит из области видимости:

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

- для глобальных объектов - после завершения функции main

- для указателей на объект деструктор вызывается неявно при использовании операции delete

Имя функции-деструктора состоит их тильды(~) и имени класса.

Деструктор не имеет аргументов и возвращаемого значения.

Деструктор не может быть объявлен как const или static.

Деструктор класса monstr:

monstr:: ~monstr()

{delete[] name;}

Дружественные функции и классы.

Дружественная функция объявляется внутри класса, к элементам которой ей нужен доступ, с ключевым словом friend.

В качестве параметра ей должен передаваться объект или ссылка на объект класса, поскольку указатель this ей не передается.

Дружественная функция может быть обычной функцией или методом другого класса.

На неё не распространяется действие спецификаторов доступа, поэтому, место её объявления в классе значения не имеет.

Одна функция может быть дружественной сразу нескольким классам.

Пример:

class monstr; // Предварительное объявление класса

class hero

{public:

void kill(monstr &);

...};

class monstr

{...

friend int steal_ammo(monstr &);

friend void hero:: kill(monstr &);

...};

int steal_ammo(monstr &M) {return --M.ammo;}

void hero:: kill(monstr &M)

{M.health=0; M.ammo=0;}

Дружественны класс.

class B

{void func1();void func2();};

class A

{...

friend class B;

...};

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

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

Нельзя перегружать операции:

- операцию выбора элемента: 'точка' (.)

- условную операцию (?

- операцию разрешения области видимости (:

- операцию определения размера (sizeof)

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

- при перегрузке операций сохраняются количество аргументов, приоритеты действий и правила ассоциации (справа налево или слева направо), используемые в стандартных типах данных

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

- функции-операции не могут иметь аргументов со значением по умолчанию

- функции-операции не могут быть статическими

Функцию-операцию можно определить тремя способами:

- как метод класса

- как дружественную функцию класса

- как обычную функцию

Формат описания функции-операции:

Тип operator знак_операции(список параметров)

{// тело функции}

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

Унарная функция, определяемая внутри класса - нестатический метод без параметров. Операндом является вызвавший её объект.

class monstr

{...

monstr& operator ++ ()

{++health; return *this;}};

monstr Vasia; ++Vasia;

Если функция-операция определяется вне класса (как глобальная), она должна иметь один параметр класса.

class monstr

{...

friend monstr& operator ++ (monstr &M);};

monstr& operator ++ (monstr &M)

{++M.health; return M;};

Постфиксные унарные операции

Операции постфиксного инкремента и декремента должны иметь параметр типа int.

class monstr

{...

const monstr operator ++ (int)

{monstr M(*this); health++;

return M;}};

monstr Vasia;

Vasia++;

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

Бинарная функция - операция, определяемая внутри класса, должна быть представлена с помощью нестатического метода с параметром, при этом вызвавший её объект считается левым операндом, а параметр - правым.

class monstr

{...

bool operator > (const monstr &M)

{if (health>M.health) return true;

return false;}};

// Операция может быть определена как глобальная фунция

bool operator > (const monstr &M1, const monstr &M2)

{if (M1.get_health()>M2.get_health())

return true; return false;}

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