Здавалка
Главная | Обратная связь

Еще раз о перегрузке...



Сегодня мы с вами подводим итоги по перегрузке операторов. Поэтому в данном разделе мы остановимся на рассмотрении еще нескольких примеров.

Оператор "круглые скобки".()

Оператор "круглые скобки" чаще всего используется, в тех ситуациях, когда нам необходимо дать пользователю класса возможность изменить содержимое объекта уже после того, как последний создан. То есть, с помощью данного оператора мы убираем из класса функции типа SetValue:

# include <iostream>using namespace std;class MyPoint{ int X; int Y;public: MyPoint(){ X=0; Y=0; } // функция, которая используется для изменения // значений полей объекта уже после его создания // именно от нее мы будем избавляться с помощью // перегрузки круглых скобок void SetValue(int x,int y){ X=x; Y=y; } void Show(){ cout<<X<<" "<<Y<<"\n\n"; }};void main(){ MyPoint P; P.Show(); //изменение значений полей объекта P.SetValue(2,3); P.Show();}

Как видите, приведенный пример класса достаточно прост. Упростим его еще больше :))). Для этого используем "круглые скобки" со следующим синтаксисом:

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

Модифицируем код:

# include <iostream>using namespace std;class MyPoint{ int X; int Y;public: MyPoint(){ X=0; Y=0; } // перегруженный оператор () void operator()(int x,int y){ X=x; Y=y; } void Show(){ cout<<X<<" "<<Y<<"\n\n"; }};void main(){ MyPoint P; P.Show(); //изменение значений полей объекта P(2,3); P.Show();}

Достаточно просто, не правда ли??? Однако всегда есть особенности которые вам необходимо запомнить:

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

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

Перегрузка операторов new, new[], delete, delete[]

Сразу следует отметить, что операции new и delete предопределены для любого типа, в том числе и для абстрактного типа, определенного через механизм классов. То есть создавать их перегрузку в классе не обязательно. Однако, бывает необходимо использовать для объекта какой-то необычный способ выделения памяти. Для этого new и delete можно перегрузить. Например, нужно выделять память и, в случае отсутствия её, создавать файл на диске, в который будет записываться информация. Осуществить такую перегрузку очень просто. Рассмотрим общий синтаксис:

Для выделения памяти под один объект и удаление её: void* operator new(size_t размер){ код оператора return указатель_на_память; } void operator delete(void* p){ код оператора } Для выделения памяти под множество объектов и удаление её: void* operator new[](size_t размер){ код оператора return указатель_на_память; } void operator delete[](void* p){ код оператора }






©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.