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

Lect13

.pdf
Скачиваний:
7
Добавлен:
06.02.2016
Размер:
2 Мб
Скачать
☆

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

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

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

◦(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

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