Выбрать главу

Как вы знаете, операторы "++" и "--" имеют префиксную и постфиксную формы. Например, оператор инкремента можно использовать в форме

++0;

и в форме

0++;.

Как отмечено в комментариях к предыдущей программе, функция operator++() определяет префиксную форму оператора "++" для класса three_d. Но нам ничего не мешает перегрузить и постфиксную форму. Прототип постфиксной формы оператора "++" для класса three_d имеет следующий вид.

three_d three_d::operator++(int notused);

Операторы инкремента и декремента имеют как префиксную, так и постфиксную формы.

Параметр notused не используется самой функцией. Он служит индикатором для компилятора, позволяющим отличить префиксную форму оператора инкремента от постфиксной. (Этот параметр также используется в качестве признака постфиксной формы и для оператора декремента.) Ниже приводится один из возможных способов реализации постфиксной версии оператора "++" для класса three_d.

// Перегрузка постфиксной версии оператора "++".

three_d three_d::operator++(int notused)

{

 three_d temp = *this; // сохранение исходного значения

 x++; // инкремент координат х, у и z

 у++;

 z++;

 return temp; // возврат исходного значения

}

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

three_d temp = *this;

Сохраненное значение операнда (в объекте temp) возвращается с помощью инструкции return. Следует иметь в виду, что традиционный постфиксный оператор инкремента сначала получает значение операнда, а затем его инкрементирует. Следовательно, прежде чем инкрементировать текущее значение операнда, его нужно сохранить, а затем и возвратить (не забывайте, что постфиксный оператор инкремента не должен возвращать модифицированное значение своего операнда).

В следующей версии исходной программы реализованы обе формы оператора "++".

// Демонстрация перегрузки оператора "++" с

// использованием его префиксной и постфиксной форм.

#include <iostream>

using namespace std;

class three_d {

  int x, у, z; // 3-мерные координаты

 public:

  three_d() { x = у = z = 0; }

  three_d(int i, int j, int k) {x = i; у = j; z = k; }

  three_d operator+(three_d op2); // Операнд op1 передается неявно.

  three_d operator=(three_d op2); // Операнд op1 передается неявно.

  three_d operator++(); // префиксная версия

  three_d operator++(int notused); // постфиксная версия

  void show();

};

// Перегрузка оператора " + ".

three_d three_d::operator+(three_d op2)

{

 three_d temp;

 temp.x = x + op2.x; // Операции сложения целочисленных

 temp.у = у + ор2.у; // значений сохраняют оригинальный

 temp.z = z + op2.z; // смысл.

 return temp;

}

// Перегрузка оператора присваивания.

three_d three_d::operator=(three_d op2)

{

 x = op2.x; // Операции присваивания целочисленных

 у = ор2.у; // значений сохраняют оригинальный

 z = ор2.z; // смысл.

 return *this;

}

// Перегрузка префиксной версии оператора "++".

three_d three_d::operator++()

{

 х++; // инкремент координат х, у и z

 У++;

 z++;

 return *this;

}

// Перегрузка постфиксной версии оператора "++".

three_d three_d::operator++ (int notused)