Lect13
.pdfПерегрузкаприсваивающих операций
Важно,чтобыперегруженные присваивающиеоперациивозвращали
ссылкуналевыйоперанд,чтобы можнобылоиспользоватьвыражения, допустимыедлявстроенныхтипов данных:
◦(a += b) /= c;
21
Реализацияоперации+=
class Vector2D { public:
…
Vector2D& operator +=(Vector2D const& vector
{
x += vector.x; y += vector.y; return *this;
}
//операции *=, /=, -=
//перегружаются аналогичным образом
…
};
22
Перегрузкаоперацийсравнения
Операциисравнениясравнивают значенияоперандов,неизменяяих,и возвращаютрезультаттипаbool, соответствующийрезультату сравнения
Длядвумерныхвекторовтакими операциямиявляются:
◦==
◦!=
23
Реализацияопераций== и!=
Операциисравнениясравнивают значенияоперандов,неизменяяих,и возвращаютрезультаттипаbool, соответствующийрезультату сравнения
Длядвумерныхвекторовтакими операциямиявляются:
◦==
◦!=
24
Реализацияопераций== и!=
class Vector2D { public:
…
bool operator ==(Vector2D const& other)const{ return (x == other.x) && (y == other.y);
}
bool operator !=(Vector2D const& other)const{ return (x != other.x) || (y != other.y);
}
…
};
25
Перегрузкаунарных+ и-
Помимоинфиксныхопераций бинарногоплюсаибинарногоминуса естьихунарныепрефиксныеверсии
Ихтакжеможноприжелании перегрузить(всемитремяспособами)
◦Наиболеепредпочтительныйвариант – перегрузкавнутрикласса:вэтомслучае текущийэкземплярклассасчитается аргументомданногооператора
26
Примерперегрузкиунарных+ и-
class Vector2D { public:
…
Vector2D const operator –()const { return Vector2D(-x, -y);
} |
|
Vector2D const operator +()const |
{ |
// возвращаем копию |
|
return *this; |
|
} |
|
… |
|
}; |
|
27
Перегрузкаоперации присваивания.
Операцияприсваиванияможетбыть:
◦Автоматически сгенерированной
◦Перегруженной
◦Запрещенной
Каждыйконкретныйвариант выбираетсявсоответствиисобластью ответственностикласса
28
Автоматическисгенерированная операцияприсваивания
Операцияприсваивания,какиконструктор копированияможетбытьавтоматически сгенерированакомпилятором
◦Автоматическисгенерированнаяоперацияприсваивания выполняетвызовоперацийприсваиваниядлявсехсвоих полей,атакжеполейродительскогокласса(вслучаеего наличия)
Врядеслучаевкомпиляторнеможетсгенерировать операциюприсваивания
◦Класссодержитссылкииликонстанты
◦Вродительскомклассеоперацияприсваиванияобъявлена закрытой
29
Случаисозданиясобственной операцииприсваивания
Какправило,вовсехслучаях,когдаклассунужен собственныйконструкторкопирования
Операцияприсваиваниядолжнавозвращатьссылку налевыйоперанд,чтобыбыливозможны следующиевыражения,допустимыедля встроенныхтипов:
◦if ((a = b) == c) {…}
Операцияприсваиваниядолжнакорректно обрабатыватьнекоторыеособенныеситуации
◦Присваиваниеобъектасамомусебенедолжноприводитьк порчеданных
◦Наиболеенадежныйспособсозданиякопии– использовать конструкторкопирования
30