The line:
return temp;
is where the second destructor is being called. When you return a locally declared object, a new object is created using a ''copy constructor'' since the locally declared object will disappear (destroyed) when the function returns. This new object is then destroyed after the assignment has been completed.
Add the following member function:
Counter (const Counter &source) : count (source.count){ cout << "Copy constructor called " << endl;}
and all should be revealed.
Your ++ operator should really be:
const Counter &operator ++ (){ ++count; return *this;}
and that will get rid of all the temporary objects being constructed / destroyed (which can save huge amounts of time).
I suggest reading the "Effective C++" book by Meyers. It discusses this and other issues in some depth.
Skizz