一个有趣的对象生灭有关问题和重载操作符有关问题,解决有重谢!

一个有趣的对象生灭问题和重载操作符问题,解决有重谢!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#include<iostream>

using namespace std;

class Ratio{
     friend ostream& operator<<(ostream&,const Ratio&);
private:
int num,den;
public:
       Ratio(int n=1,int d=1):num(n),den(d){cout<<"Radio lives!"<<endl; };
Ratio(const Ratio& r):num(r.num),den(r.den),id(r.id){cout<<"Copy!"<<endl; };
~Ratio(){cout<<"Radio  dies!"<<endl; };
Ratio& operator=(const Ratio&);
Ratio& operator++();
Ratio operator++(int);
};

Ratio& Ratio::operator ++(){ 
    num+=den;
return *this;
}

Ratio Ratio::operator ++(int i){
    Ratio temp=*this;
num+=den;
return temp;
}

Ratio& Ratio:: operator=(const Ratio& r){
    num=r.num;
den=r.den;
cout<<"Overwrite = !"<<endl;
return *this;
}


ostream& operator<<(ostream& o,const Ratio& r){
  o<<r.num<<"/"<<r.den;
  return o;
}

void main(){
   Ratio one(1,2);

   Ratio three=one;
  Ratio y=one;
   cout<<y++<<endl;
   y++=three;
   cout<<y<<endl;
}


这一句
cout<<y++<<endl;

的执行结果是:
Copy!
Copy!
Radio dies!
1/2
Radio dies!

①现在第一个问题就来了:前4句我都能知道为什么输出,可是最后一句是怎么回事?同一个对象die了2次吗?
设置了单步运行后发现好像是ostream内部输出来的,可是为什么啊?

②第二个问题是:  这一句
  y++=three;

因为是后++,所以我认为应该先是y=three,再执行y++,结果应为3/2;
可是输出的结果却是y=5/2;
为什么啊?是我代码写得不对吗?

初学c++小白一枚,还望各大神多多指教!
------解决思路----------------------
1. ++产生了临时对象,就是里面的temp
2. y++得到的是右值,赋值没有意义, 这语句可以这样看 temp=y , y++, temp=three
------解决思路----------------------
问题1:既然两次copy,当然有两次die:


Ratio Ratio::operator ++(int i){
    Ratio temp=*this;//第一次copy:拷贝构造temp
    num+=den;
    return temp;//第二次copy:拷贝构造临时对象
}//第一次die:释放temp;
.....
cout<<y++<<endl;
//第二次die:释放临时对象。

------解决思路----------------------

y++=three;


实际上是:

y.operator ++(0).operator=(three);


很明显要先调用operator++(int),然后再调用 operator=(Ratio const &)。three被赋值给y.operator++(int)的返回值,这是一个临时对象,在这条语句结束后,这个临时对象就被释放了。因此这个赋值其实 是个无效操作。