As Jochen Arndt said :
const Counter Counter::operator++(int)
{
Counter temp(*this);
++itsVal;
return temp;
}
Just after Calling this Fucntion :
this-> itsVal will be equal to 1 but Temp->itsVal =0 and when u return temp you ll return an instance of the Counter with itsVal = 0. in the other hand if you ll return *this you ll be returning an instance with itsVal incremented by 1.
try some cases like :
Counter Y = i++;
or
const Counter Counter::operator++(int)
{
++itsVal;
Counter temp(*this);
return temp;
}