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

12. Перегрузка операций (операторов). Перегрузка операторов инкремента и декремента. Перегрузка оператора индексирования. Перегрузка оператора вызова функции.

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

Пример: (4 - j4) + (5 + j10); (15 20' SY45"SY) + (53 57' 40"); "combine" + "strings"

В C++ можно перегружать множество операций. Например:+,-,/,*,=,<,>,== и мн. др.

Главное ограничение состоит в том, что синтаксис и приоритет операции не должны изменяться по сравнению с первоначально определенными. Другой важный момент — перегрузка операции возможна только в области действия того класса, в котором она выполняется.

Для перегрузки операции используется ключевое слово operator, за которым следует сама операция:

тип operator операция (список параметров)

Например: angle_value operator +(angle_argument);

Здесь angle_value — название типа класса, за ним следуют ключевое слово operator, символ самой операции (+) и параметр, передаваемый перегруженной операции.

2. class Int

{

private:

int Key;

public:

Int(int = 0);

Int& operator++(); //Префиксная форма.

const Int operator++(int); //Постфиксная форма.

};

Int& Int :: operator++()

{

++Key;

return *this;

}

const Int Int :: operator++(int)

{

Int temp(*this);

++Key;

return temp;

}

3. class Int

{

private:

int Key;

public:

Int(int = 0);

int& operator[](int);

};

int& Int :: operator[](int i)

{

//без проверки на граници массива

return Key[i];

}

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

Тип_Возвращаемого_Значения operator () (список_аргументов);

Перегруженный оператор вызова функции не изменяет механизма вызова функции, он изменяет только то как оператор интерпретируется при его применении к объекту данного класса. Перегруженный оператор вызова функции должен быть нестатической функцией-членом класса.

13.Перегрузка операций (операторов). Перегрузка операторов доступа к членам класса. Перегрузка операторов new и delete. Функции преобразования типа.

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

Пример: (4 - j4) + (5 + j10); (15 20' SY45"SY) + (53 57' 40"); "combine" + "strings"

В C++ можно перегружать множество операций. Например:+,-,/,*,=,<,>,== и мн. др.

Главное ограничение состоит в том, что синтаксис и приоритет операции не должны изменяться по сравнению с первоначально определенными. Другой важный момент — перегрузка операции возможна только в области действия того класса, в котором она выполняется.

Для перегрузки операции используется ключевое слово operator, за которым следует сама операция:

тип operator операция (список параметров)

Например: angle_value operator +(angle_argument);

Здесь angle_value — название типа класса, за ним следуют ключевое слово operator, символ самой операции (+) и параметр, передаваемый перегруженной операции.

Операторы new и delete можно перегрузить. Для этого есть несколько причин:

  • Можно увеличить производительность за счёт кеширования: при удалении объекта не освобождать память, а сохранять указатели на свободные блоки, используя их для вновь конструируемых объектов.

  • Можно выделять память сразу под несколько объектов.

  • Можно реализовать собственный "сборщик мусора" (garbage collector).

  • Можно вести лог выделения/освобождения памяти.

В С++ имеются две возможности перегрузки операторов new и delete - локально (в пределах класса) и глобально (в пределах программы). Эти операторы имеют правила переопределения, отличные от рассмотренных выше правил переопределения других операторов. Одна из причин перегрузки операторов new и delete состоит в том, чтобы придать им новые свойства, например, выдачи диагностики или более высокой защищенности от ошибок. Кроме того, может быть реализована более эффективная схема распределения памяти по сравнению со схемой, обеспечиваемой системой.

Оператор new можно задать в следующих формах:

<::> new <аргументы> имя_типа <инициализирующее_выражение>;

<::> new <аргументы> имя_типа [ ];

Параметр ”аргументы” можно использовать либо для того, чтобы различить разные версии глобальных операторов new, либо для использования их в теле функции operator. Доопределенную функцию operator new можно объявить:

void *operator new(size_t t<список _аргументов>);

void *operator new[](size_t t<список _аргументов>);

Вторая форма используется для выделения памяти для массивов. Возвращаемое значение всегда должно иметь тип void *. Единственный обязательный аргумент функции operator всегда должен иметь тип size_t. При этом в функцию operator автоматически подставляется аргумент sizeof(t).

В стандарте C++ предусмотрено несколько шаблонных функций для преобразования типов.const_cast<> - предназначен для снятия модификаторов const и volatile.

dynamic_cast<> - преобразовывает указатель на базовый тип к указателю на тип наследник, если объект действительно наследник, или вернет NULL в противном случае. При преобразовании используется RTTI (run-time type identification).

static_cast<> - шаблонная функция, для статического (т.е. на этапе компиляции) преобразования типов.