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


Пререгрузка операций наряду с перегрузкой функций и методов обеспечивает полиморфизм именований в С++. Например. Функции и методы, определенные в классе, могут иметь одинаковые имена и одинаковые или различные типы возвращаемых значений, но тогда они должны различатся типом и/или числом и/или порядком перечисления аргументов. Или как ещё говорят различаться сигнатурой. В неких случаях компилятор может при вызове функций ии методов предпринимать попытку преобразования типов аргументов в вызовае и если в этом случае он не может определить какя функция будет использоваться в вызове, то возникает ошибка. Один из методов от не избавиться указать явно тип преобразования значения аргументов в вызове.

В С++ имеется спсок операций которые можно перегрузить: +, -, *, /, [], ->, ->*…

Легче запомнить те, которые нельзя перегрузить: 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;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.009 сек.