Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lect13

.pdf
Скачиваний:
6
Добавлен:
06.02.2016
Размер:
1.67 Mб
Скачать

Перегрузкаприсваивающих операций

Важно,чтобыперегруженные присваивающиеоперациивозвращали

ссылкуналевыйоперанд,чтобы можнобылоиспользоватьвыражения, допустимыедлявстроенныхтипов данных:

(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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]