Читайте также:
|
|
Операторы инкремента и декремента попадают в отдельную категорию, поскольку каждый из них имеет два варианта: префиксный и постфиксный. Чтобы различить префиксный и постфиксный варианты этих операторов, используется следующее правило:
> префиксная форма объявляется в точности так же, как любой другой унарный оператор;
> постфиксная форма принимает дополнительный аргумент типа int.
На самом деле этот аргумент обычно не используется и при передаче в функцию равен нулю (однако при желании он может быть использован). Этот параметр просто указывает компилятору, что речь идет о постфиксной форме оператора.
В C++ для оператора ++ определено увеличение операнда на единицу. В классе задач, для которых мы создаём класс Vec, такие действия, скорее всего, не потребуются. Поэтому в данном случае удобно для операции декремента и инкремента определить операции поворота вектора на 90° и -90° соответственно.
Следующий пример показывает, как определить префиксную и постфиксную формы операторов инкремента для класса Vec.
Файл Vech
class Vec // класс вектора
{
• • •
public:
Объектно-ориентированное программирование
Лекция 8 Перегрузка операторов 10
Vec & operator ++ (); // префиксная форма оператора инкремента
Vec operator ++ (int); // постфиксная форма оператора инкремента
};
Файл Vec.cpp
#include ”Vec.h”
• • •
// реализация перегруженных операторов инкремента с помощью функций-членов класса
Vec & Vec:: operator ++ () // префиксная форма
{
double buff = x; // x и y обмениваются значениями
x = -y; y = buffer; // через промежуточную переменную buffer
return *this; // возвращает ссылку на текущий объект
}
Vec Vec:: operator ++ (int) // постфиксная форма
{
Vec T = *this; // объявляет временный объект и
// инициализирует его значением текущего объекта
++ *this; // вызывает префиксную форму оператора инкремента
return T; // возвращает временный объект
}
Файл Main.cpp #include ”Vec.h” void main () {
char S [ 30 ];
Vec A ("A", 3, 4), B ("B"); // объявляет вектора
CharToOem ("\t\tПрефиксная форма\n", S); cout<<S;
~ (B = ++ A); ~ A; // вызывает префиксную форму оператора инкремента
CharToOem ("\t\tПостфиксная форма\n", S); cout<<S;
~ (B = A ++); ~ A; // вызывает постфиксную форму оператора инкремента
}
При выполнении программа выводит на экран:
Префиксная форма
Проекции вектора B x = -4 y = 3
Проекции вектора A x = -4 y = 3
Постфиксная форма
Проекции вектора B x = -4 y = 3
Проекции вектора A x = -3 y = -4
Как видно из результата работы программы префиксная форма вызывается раньше оператора присвоения, постфиксная как бы – после. Достигается этот результат тем, что постфиксная форма создает временный объект и инициализирует его значением текущего, изменяет текущий и возвращает временный.
Обратите внимание, что постфиксная форма операторной функции возвращает не ссылку, а сам объект, поскольку из функции нельзя возвращать ссылку на временный объект.
Рассмотрим теперь перегрузку операторов инкремента с помощью дружественных функций. Заметим, что при использовании дружественной функции для перегрузки этих операторов в операторную функцию нужно передавать параметр в виде ссылки, поскольку он должен быть изменен в функции, и это измененное значение объекта должно быть возвращено.
Файл Vec.h
class Vec // класс вектора
{
• • •
public:
friend Vec & operator ++ (Vec & D); // префиксная форма оператора декремента friend Vec operator ++ (Vec & D, int); // постфиксная форма оператора декремента
};
Файл Vec.cpp
#include ”Vec.h”
Объектно-ориентированное программирование |
• • •
Лекция 8 Перегрузка операторов 11
// реализация перегруженных операторов инкремента с помощью дружественных функций
Vec & operator ++ (Vec & V) // префиксная форма
{
double buff = V.x; // V.x и V.y обмениваются значениями
V.x = -V.y; V.y = buffer; // через промежуточную переменную buffer
return V; // возвращает ссылку на параметр функции
}
Vec operator ++ (Vec & V, int) // постфиксная форма
{
Vec T = V; // объявляет временный объект и
// инициализирует его значением текущего объекта
++ V; // вызывает префиксную форму оператора инкремента
return T; // возвращает временный объект
}
Файл Main.cpp #include ”Vec.h” void main () {
Dot A ('A'), B ('B'), C ('C'), D ('D'); // объявляет вершины квадрата
Vec AB ("AB", +A, +B); // вводит координаты двух вершин квадрата с клавиатуры
// объявляет и вычисляет вектор AB
~ (D = A + ++AB); // поворачивает вектор на 90°,
// складывает точку A с повёрнутым вектором,
// результат сложения передаёт в точку D,
// выводит на экран координаты точки D
~ (C = B + AB); // складывает точку B с повёрнутым вектором,
// результат сложения передаёт в точку C, // выводит на экран координаты точки C
}
При выполнении программа выводит на экран:
Дата добавления: 2015-11-26; просмотров: 67 | Нарушение авторских прав