Как вы знаете, операторы "++" и "--" имеют префиксную и постфиксную формы. Например, оператор инкремента можно использовать в форме
++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)