Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпора 57стр.doc
Скачиваний:
54
Добавлен:
15.06.2014
Размер:
478.21 Кб
Скачать

Вопрос 13. Понятие перегрузки операций.

Большинство операторов могут быть перегружены, в рез-те чего они получат специальное значение по отн-ю к определённым классам. Когда опер-р перегружен, ни одно из его исходных значений не теряет смысла. Просто для опред-го класса объектов определён новый оператор.

Общая форма записи (для функции-члена):

тип имя_класса::operator#(список_аргументов)

{ … }

Чтобы использовать операцию над объектами классов, эта операция должна быть перегружена, но есть два исключения. Операция присваивания (=) может быть использована с каждым классом без явной перегрузки. По умолчанию операция присваивания сводится к побитовому копированию данных-элементов класса. Операция адресации (&) также может быть использована с объектами любых классов без перегрузки; она просто возвращает адрес объекта в памяти. Но операцию адресации можно также и перегружать.

Цель перегрузки операций: обеспечение кратких выражений для типов, определенных пользователем. Перегрузка операций не выполняется автоматически; Иногда эти функции лучше сделать функциями-эле­ментами, иногда — функциями-друзьями, а случается, что лучше не делать их ни элементами, ни друзьями.

Большинство операций можно перегружать. Нельзя перегрузить (.)(::)(?:)(->) т.к. главное не значение, а имя.

Св-ва:

Изменить кол-во операндов, к-ое берет операция, невозможно: перегруженные унарные операции остаются унарными, перегруженные би­нарные операции остаются бинарными.

Создавать новые операции невозможно; перегружать можно только уже существующие операции.

Нельзя изменить с помощью перегрузки операции смысл работы опера­ции с объектом встроенного типа. Пере­грузка операций применима только для работы с объектами типов, определенных пользователем, или со смесью объектов типов, определенных пользователем, и встроенных типов.

Class myclass{…};

Myclass a,b,c;

A=b+c;//обычная запись

A=operator+(b,c);//функциональная запись

A=b.operator+(c); // ф-я класса

Вопрос 14. Функции-операции как члены класса и как друж-е функции

Перегрузка операций в форме внешних ф-й

Чтобы перегрузить оператор в форме внешней ф-ции, необходимо определить глобальную ф-цию.

class String {

friend String& operator+(const String&, const String&);

private:

char* s; }

String& operator+(const String& s1, const String& s2)

{ .... }

Перегруженная ф-ция выглядит так же, как и любая глобальная ф-ция. Именно для таких случаев и были придуманы друзья. Если бы мы не объявили ф-цию operator+ другом, то она не имела бы доступа к переменной s.

Внешними ф-циями могут перегружаться любые операторы, кроме операторов преобразования, =, [], () и -> — все эти операторы должны перегружаться только ф-циями класса.

Перегрузка операторов в форме функций класса

Синтаксис напоминает обычную перегрузку функций класса, разве что кол-во аргументов уменьшается на 1 по сравнению с формой внешней ф-ции.

class String { private:

char* s;

public:

String& operator+(const String&) const; };

String& String::operator+(const String& s1) const

{ char* s2 = new char[strlen(s1.s) + strlen(s) + 1];

strcat(s2, s1, s);

String newStr(s2);

delete s2;

return newStr; }

Любой оператор может быть перегружен в форме ф-ции класса. Не применяется в случае если:

1. Первый аргумент относится к базовому типу (например, int или double).

2. Тип первого аргумента определен в коммерческой библиотеке, которую нежелательно

модифицировать.