Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Перегрузка операторов инкремента и декремента

Читайте также:
  1. ГЛАВА 11 • НОВЫЙ ПОВОРОТ В ДЕЛЕ ОПЕРАТОРОВ 151
  2. ГЛАВА 3. НАЧИНАЕМ ПОНИМАТЬ ОПЕРАТОРОВ
  3. Добавочная (инкрементальная) архивация
  4. Задание 1. Перегрузка функций
  5. Задание 3. Исследование зависимости логарифмического декремента затухания от сопротивления колебательного контура.
  6. Лабораторная работа №7. Перегрузка операций.
  7. Ошибки операторов

Операторы инкремента и декремента попадают в отдельную категорию, поскольку каждый из них имеет два варианта: префиксный и постфиксный. Чтобы различить префиксный и постфиксный варианты этих операторов, используется следующее правило:

> префиксная форма объявляется в точности так же, как любой другой унарный оператор;

> постфиксная форма принимает дополнительный аргумент типа 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 | Нарушение авторских прав



mybiblioteka.su - 2015-2024 год. (0.009 сек.)