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

Пример 1
class monstr
{
monstr &operator ++()
{
++health;
return *this;
}
};

monstr Vasia;
cout<<(++Vasia).get_health();

Если унарная операция определена вне класса, она должна иметь один параметр - типа класса

Пример 2
class monstr
{
friend monstr &operator ++(monstr &M);
};

monstr &operator ++ (monstr &M)
{
++M.health;
return M;
}

Если не описывать функцию внутри класса как дружественную функцию, нужно учитывать доступность полей. В данном примере поле health не доступно извне, т.к. описано как private. Для его изменения следует использовать специальные методы. Введем в класс monstr специальный метод change_health, который будет позволять менять значение health:
Пример 3

void change_health( int he ) {health =he;} 
При вводе этого метода можно перезагружать оператор инкрементации с помощью обычной функции, описанной вне класса:

Пример 4
monstr &operator ++ (monstr &M)
{
int h=M.get_health();
h++;
M.change_health(h);
return M;
}

В случае использования оператора постфиксного инкремента и декремента дадим им первый параметр типа int . Он используется для того, чтобы отличить их от префиксной формы.
Пример 5

const monstr operator ++ (int)
{
monstr M(*this);
health++;
/* Лучше ++(*this); */
return M;
}

monstr Vasia;
cout << (Vasia++).get_health();