关于C++后置运算符重载一个超简单问题

以下代码
#include
using namespace std;
class num
{
public:
num(){n=1;cout<<"构造函数执行\n";}
num(int i){n=i;cout<<"带一个参数的构造函数执行\n";}
num(const num&s){this->n=s.n;cout<<"复制构造函数执行\n";}
~num(){cout<<"析构函数执行\n";}
int get()const{return n;}
void set(int x){n=x;}
void add(){++n;}

const num operator++(int o)
{
    num temp(*this);
    ++n;
    return temp;
}

private:
int n;
};
int main()
{
num i;
cout<<"i:"<<i.get()<<endl;
i.add();
cout<<"i:"<<i.get()<<endl;
num n=i++;
cout<<"i:"<<i.get()<<endl;
cout<<"n:"<<n.get()<<endl;
return 0;
}

运行后显示

构造函数执行
i:1
i:2
复制构造函数执行
复制构造函数执行
析构函数执行
i:3
n:2
析构函数执行
析构函数执行

请问为什么要执行两次复制构造函数 复制构造的都是什么?
还有请问依次析构的三个对象是什么?
谢谢!!

第一次构造:num i;
第二次构造:num=i++;重载了++运算符,在里面num temp时
第三次复制构造:return temp;
这三次都调用了析构函数

const operator ++
里面会调用两次拷贝构造函数 一次析构函数

然后主函数会调用两次析构函数

第一次构造:num i;
第二次构造:num=i++;重载了++运算符,在里面num temp时
第三次复制构造:return temp;
这三次都调用了析构函数