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

а = b = с = d;

необходимо, чтобы операторная функция operator=() возвращала объект, адресуемый указателем this, и чтобы этот объект располагался слева от оператора "=". Это позволит выполнить любую цепочку присваиваний. Операция присваивания — это одно из самых важных применений указателя this.

Узелок на память. Если для перегрузки бинарного оператора используется функция-член, объект, стоящий слева от оператора, вызывает операторную функцию и передается ей неявно через указатель this. Объект, расположенный справа от оператора, передается операторной функции как параметр.

Использование функций-членов для перегрузки унарных операторов

Можно также перегружать такие унарные операторы, как "++", "--", или унарные "-" и "+". Как упоминалось выше, при перегрузке унарного оператора с помощью функции-члена операторной функции ни один объект не передается явным образом. Операция же выполняется над объектом, который генерирует вызов этой функции через неявно переданный указатель this. Например, рассмотрим расширенную версию предыдущего примера программы. В этом варианте для объектов типа three_d определяется операция инкремента.

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

#include <iostream>

using namespace std;

class three_d {

  int x, y, 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++(); // префиксная версия оператора ++

  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 = op2.z; // смысл.

 return *this;

}

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

three_d three_d::operator++()

{

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

 у++;

 z++;

 return *this;

}

// Отображение координат X, Y, Z.

void three_d::show()

{

 cout << x << ", ";

 cout << у << ", ";

 cout << z << "\n";

}

int main()

{

 three_d a(1, 2, 3), b(10, 10, 10), c;

 a.show();

 b.show();

 с = a + b; // сложение объектов а и b

 c.show();

 c=a+b+c; // сложение объектов a, b и с

 с.show();

 с = b = a; // множественное присваивание

 с.show();

 b.show();

 ++c; // инкремент с

 c.show();

 return 0;

}

Эта версия программы генерирует такие результаты.

1, 2, 3

10, 10, 10

11, 12, 13

22, 24, 26

1, 2, 3

1, 2, 3

2, 3, 4

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