Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП на языке С++.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2 Мб
Скачать
☆

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

В языке С++ определены множества операций над переменными стандартных типов, такие как +, *, / и т.д. Каждую операцию можно применить к операндам определенного типа.

К сожалению, лишь ограниченное число типов непосредственно поддерживается любым языком программирования. Например, С и С++ не позволяют выполнять операции с комплексными числами, матрицами, строками, множествами. Однако все эти операции можно выполнить через классы в языке С++.

Рассмотрим пример.

Пусть заданы множества А и В:

А = {а1,а2,а3};

В = {a3,a4,a5},

и мы хотим выполнить операции объединения (+) и пересечения (*) множеств.

А+В = {a1,a2,a3,a4,a5}

А*В = {a3}.

Можно определить класс Set-“множество” и определить операции над объектами этого класса, выразив их с помощью знаков операций, которые уже есть в языке С++, например, + и *. В результате операции + и * можно будет использовать как и раньше, а также снабдить их дополнительными функциями (объединения и пересечения). Как определить, какую функцию должен выполнять оператор: старую или новую? Очень просто – по типу операндов. А как быть с приоритетом операций? Сохраняется определенный ранее приоритет операций. Для распространения действия операции на новые типы данных надо определить специальную функцию, называемую «операция-функция» (operator-function). Ее формат:

тип_возвр_значения operator знак_операции

(специф_параметров ) {операторы_тела_функции}

При необходимости может добавляться и прототип:

тип_возвр_значения operator знак_операции

(специф_параметров)

Если принять, что конструкция operator знак_операции есть имя некоторой функции, то прототип и определение операции-функции подобны прототипу и определению обычной функции языка С++. Определенная таким образом операция называется перегруженной (overload).

Чтобы была обеспечена явная связь с классом, операция-функция должна быть либо компонентом класса, либо она должна быть определена в классе как дружественная и у нее должен быть хотя бы один параметр типа класс (или ссылка на класс). Вызов операции-функции осуществляется так же, как и любой другой функции С++: operator .Однако разрешается использовать сокращенную форму ее вызова: a b , где –знак операции.

3.1. Перегрузка унарных операций

  • Любая унарная операция  может быть определена двумя способами: либо как компонентная функция без параметров, либо как глобальная (возможно дружественная) функция с одним параметром. В первом случае выражение  Z означает вызов Z.operator(), во втором–вызов operator(Z).

  • Унарные операции, перегружаемые в рамках определенного класса, могут перегружаться только через нестатическую компонентную функцию без параметров. Вызываемый объект класса автоматически воспринимается как операнд.

  • Унарные операции, перегружаемые вне области класса (как глобальные функции), должны иметь один параметр типа класса. Передаваемый через этот параметр объект воспринимается как операнд.

Синтаксис:

а) в первом случае (описание в области класса):

тип_возвр_значения operator знак_операции

б) во втором случае (описание вне области класса):

тип_возвр_значения operator знак_операции(идентификатор_типа)

Примеры.

1)

class person

{int age;

//другие поля

public:

//конструкторы, деструктор и другие методы

void operator++(){ ++age;}

};

void main()

{

class person jon;

++jon;

}

2)

class person

{int age;

//другие поля

public:

//конструкторы, деструктор и другие методы

friend void operator++(person&);

};

void operator++(person&ob)

{++ob.age;}

void main()

{

class person jon;

++jon;

}