In the article Operator 
  Overloading using Friend Functions, we saw how we can overload simple 
  operators using friend functions, in the other article Overloading 
  Increment/Decrement Operators, we saw the method of overloading increment/decrement 
  operators as member functions. Combining both these, we’ll try to overload 
  the increment/decrement operators using friend 
  functions, in this article.
As we know there are some differences in overloading operators as a friend.
Increment/decrement are the type of operators that need to change the operands 
  itself. In the case of operator overloading as member functions, ‘this’ 
  pointer was passed so any change done would result in the operand itself 
  getting changed. But in the case of friend functions, operands are passed explicitly 
  and that also as call by value, hence it is impossible to change the operand 
  that way.
Let’s take an example, suppose we have an object ‘ob’of a 
  class say 'myclass' which overloads the increment operator,
  ob++;
This statement would result in a call to the overloaded increment (++) operator 
  function, which could be something like the one below:
  myclass operator++()
  {
    a++;
    b++;
    return *this;
  }
Supposing the data of the class we need to alter are a and b, the above statement 
  would increment the data of the object that generated the call, hence the desired 
  result is achieved.
Had the function been overloaded as a friend something like this:
  myclass operator++(myclass ob)
  {
    ob.a++;
    ob.b++;
    return ob;
  }
Then the operand’s copy (not the actual object that generated the call) 
  would have been passed to the function and any change (a++ and b++) would only 
  have incremented the data of the copy of the object passed (call by value) and 
  the data of the operand would have remained unchanged.
To overcome this we need to accept the reference 
  of the object (call by reference) as the argument to overload the operators 
  as a friend.
The following program illustrates this method:
  // Program to illustrate the overloading
  // of increment / decrement operators
  // as friends
  // NOTE: Prefix form is overloaded here
  #include <iostream.h>
  class myclass
  {
    int a;
    int b;
  public:
    myclass(){}
    myclass(int x,int y){a=x;b=y;}
    void show()
    {
      cout<<a<<endl<<b<<endl;
    }
    // accepting references
    friend myclass operator++(myclass&);
    friend myclass operator--(myclass&);
  };
  myclass operator++(myclass &ob)
  {
    ob.a++;
    ob.b++;
    return ob;
  }
  myclass operator--(myclass &ob)
  {
    ob.a--;
    ob.b--;
    return ob;
  }
  void main()
  {
    myclass a(10,20);
    myclass b(100,200);
    ++a;
    ++b;
    a.show();
    b.show();
    a=--b;
    a.show();
    b.show();
  }
Related Articles: