为什么成员函数前加上&就没有析构那么多次

问题遇到的现象和发生背景

如果把Time& add();和Time& Time::add()改成Time add();和Time Time::add()结果就变成第二个了,为什么呢?

问题相关代码,请勿粘贴截图
#include<iostream>
using namespace std;
class Time{
    int hour;
    int minute;
    int second;
public:        
    Time(int h=0,int m=0,int s=0)
{
hour=h;
minute=m;
second=s;
{cout<<"构造函数!"<<endl;}
}
    Time& add();
    void show();
    ~Time(){cout<<"析构函数!"<<endl;}
};
Time& Time::add(){
    second++;
    if(second>=60){
        second-=60;
        minute++;
        if(minute>=60){
            minute-=60;
            hour=(hour+1)%24;
        }
    }
    return (*this);                   
}
   void Time::show()
{
cout<<hour<<":"<<minute<<":"<<second<<endl;
}

int main(){    
    Time time(11,59,58);    
    for(int i=0;i<4;i++)
    {
        time.add();
        time.show();
    }
    return 0;    
}
运行结果及报错内容

1.
构造函数!
11:59:59
12:0:0
12:0:1
12:0:2
析构函数!
2.
构造函数!
析构函数!
11:59:59
析构函数!
12:0:0
析构函数!
12:0:1
析构函数!
12:0:2
析构函数!

我的解答思路和尝试过的方法
我想要达到的结果

引用类似于指针,是不会新产生对象的,自然也就不会有析构