Перегрузка операций. Пример
Пререгрузка операций наряду с перегрузкой функций и методов обеспечивает полиморфизм именований в С++. Например. Функции и методы, определенные в классе, могут иметь одинаковые имена и одинаковые или различные типы возвращаемых значений, но тогда они должны различатся типом и/или числом и/или порядком перечисления аргументов. Или как ещё говорят различаться сигнатурой. В неких случаях компилятор может при вызове функций ии методов предпринимать попытку преобразования типов аргументов в вызовае и если в этом случае он не может определить какя функция будет использоваться в вызове, то возникает ошибка. Один из методов от не избавиться указать явно тип преобразования значения аргументов в вызове.
В С++ имеется спсок операций которые можно перегрузить: +, -, *, /, [], ->, ->*…
Легче запомнить те, которые нельзя перегрузить: sizeof(), . (dot), ::, ?:, const_cas, dynmic_cast, reinterpret_cast, static_cast, typeid.
Чтобы перегрузить операцию необходимо воспользоваться функцией специального вида:
operator op(<список аргументов>)
op – символ операции (новые символы вводить нельзя)
список аргументов – содержит число аргументов на 1 меньше парности операции, если объявляется метод в классе, или равно парности, если вне класса.
!!! по меньшей мере один из аргументов должен иметь тип, определяемый пользователем; нельзя ввести новое имя операции. |
Пример:
class Time
{
private:
int hours;
int minutes;
public:
Time();
Time(int h,int m = 0);
void Reset(int h=0, int m=0);
Time operator+(const Time &t)const;
}
Time::Time()
{hours = minutes = 0;}
Time:: Time(int h,int m = 0)
{hours = h; minutes = m; }
void Time::Reset(int h, int m)
{hours = h; minutes = m; }
Time Time::operator+(const Time &t)const
{
Time sum;
sum.minutes = minutes + t.minutes;
sum. hours = hours + t.hours+ sum.minutes/60;
sum.minutes%=60;
return sum;
}
Обратите внимание на механизм передачи данных и возврат результата. Передаётся ссылка на аргумент, т.е. исходный аргумент не копируется. В теле функции создаётся объект, который будет связан с переменной sum. Когда выполнится return sum; то создаётся копия этого объекта, которая и возвращается в качестве результата, а сам исходный объект, ранее связанный с sum уничтожается.
Наиболее распространённая ошибка при работе с С++, - попытка вернуть в качестве результата указатель (или ссылку) на объект который принадлежит к автоматическому классу памяти и который уничтожается после выхода управления вычислениями за пределы зоны его существования.
Применение оператора возможно в 2 формах:
Time A;
Time B(5,40);
Time C(2,55);
A=B.operator+(C);//функциональная форма записи(B+C)
B=A+C;//опера торная форма записи.
Управление: созданный в результате выполнения объект замещает исходное выражение. Затем его содержимое копируется в объект, связанный с переменной B.
Дата добавления: 2016-05-26; просмотров: 1651;