Читайте также: |
|
В C++ существует возможность перегрузить не только функции, но и операции внутри класса, например, можно добиться того, чтобы операция * при работе с матрицами осуществляла умножение матриц, а при работе с комплексными числами — умножение комплексных чисел.
Суть перегрузки операций — одна операция используется с различными типами данных. В C++, например, при помощи операции + можно сложить комплексные числа, матрицы или символьные строки.
Пример: (4 - j4) + (5 + j10); (15 20' SY45"SY) + (53 57' 40"); "combine" + "strings"
В C++ можно перегружать множество операций. Например:+,-,/,*,=,<,>,== и мн. др.
Главное ограничение состоит в том, что синтаксис и приоритет операции не должны изменяться по сравнению с первоначально определенными. Другой важный момент — перегрузка операции возможна только в области действия того класса, в котором она выполняется.
Для перегрузки операций внутри класса нужно написать специальную функцию — метод класса. При перегрузке операций следует помнить следующее:
· нельзя поменять приоритет операций;
· нельзя изменить тип операции (из унарной операции нельзя сделать бинарную или наоборот);
· перегруженная операция является членом класса и может использоваться только в выражениях с объектами своего класса;
· нельзя создавать новые операции;
· запрещено перегружать операции:. (доступ к членам класса), унарную операцию * (значение по адресу указателя),:: (расширение области видимости),?: (операция if);
· допустима перегрузка следующих операций: +, -, *, /, %, =, <, >, +=, -=, *=, /=, &&, ||, ++, —, (), [], new, delete.
В общем случае ваши программы могут перегрузить почти все операторы С++. В табл. перечислены операторы, которые C++ не позволяет перегружать.
Оператор Назначение Пример
. Выбор элемента object.member
.* Указатель на элемент object.*member
:: Разрешение области видимости classname::member
?: Условный оператор сравнения с = (а > b)? а: b;
# Препроцессорный символ
## Препроцессорный символ
Компилятор использует перегрузку операций без участия пользователя.
Существует строго определённый синтаксис для перегрузки операций. Сама перегрузка использует ключевое слово operatorX, где X – это символ перегруж.операции.
Пример:
Point pt1, pt2, pt3;
//Вызов перегр-го оператора сложения
Pt=pt1.operator+(pt2);
Синтаксис перегрузки операции.
Синтаксис перегрузки операторов очень похож на определение функции с именем operator@, где @ — это идентификатор оператора (например +, -, <<, >>).
Для перегрузки операции используется ключевое слово operator, за которым следует сама операция:
тип operator операция (список параметров)
Например:
angle_value operator +(angle_argument);
В пределах области действия соответствующим образом описанного класса можно непосредственно складывать значения углов, выраженные в градусах, минутах и секундах:
angle_value angle1("37° 15' 56\"");
angle_value angle2("10° 44' 44\"");
angle_value sum_of_angles;
sum_of_angles =angle1+ angle2;
Как уже упоминалось в предыдущих примерах, для обозначения угловых секунд используется символ двойных кавычек ("). Этот же символ означает начало и конец символьной строки.
Перегрузка бинарных операторов.
Замечание: Перегрузка унарных и бинарных отличается. т.к. унарные операции используются реже. Общий синтаксис перегрузки бинарных:
< возвр_тип > operatorX(< тип_пар >par);
Рассмотрим синтаксис перегрузки бинарных операторов. Перегрузим один оператор, который возвращает l-значение, один условный оператор и один оператор, создающий новое значение (определим их глобально):
class Integer
{
private:
int value;
public:
Integer(int i): value(i)
{}
friend const Integer operator+(const Integer& left, const Integer& right);
friend Integer& operator+=(Integer& left, const Integer& right);
friend bool operator==(const Integer& left, const Integer& right);
};
const Integer operator+(const Integer& left, const Integer& right) {
return Integer(left.value + right.value); }
Integer& operator+=(Integer& left, const Integer& right) {
left.value += right.value;
return left; }
bool operator==(const Integer& left, const Integer& right) {
return left.value == right.value;}
Дата добавления: 2015-09-03; просмотров: 157 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Перезагрузка конструкторов | | | Перегрузка операций (операторов). Перегрузка операторов отношения и логических операторов. Перегрузка оператора присваивания. Перегрузка унарных операторов. |