1. 程式人生 > >時間類的改進(運算子過載)

時間類的改進(運算子過載)

【問題描述】
對前面實驗寫過的Time類進行修改,刪去Add和Sub成員函式,通過過載“+”、“-”運算子直接進行時間的加減運算。
提示:
(1)可以用友元函式來實現“+”“-”運算子的過載。
(2)加法運算子可以是兩個Time物件進行相加,也可以是一個表示秒數的int型資料加上一個Time物件,還可以是Time物件加上int型資料,得到的結果都是Time型別的物件。
(3)減法運算子可以是兩個Time物件進行相減,也可以是Time物件減去一個表示秒數的int型資料,得到的結果都是Time型別的物件。

主函式設計如下,請勿修改:

int main(){
Time t1(2,34),t2,t3;
t2.SetTime(13,23,34);
cout<<"t1+t2:";
t3=t1+t2;//兩個Time類物件相加
t3.print_24();
cout<<"\nt1+65:";
t3=t1+65;//Time類物件加上65秒
t3.print_24();
cout<<"\n65+t1:";
t3=65+t1;//65秒加上Time類物件
t3.print_24();
cout<<"\nt2-t1:";
t3=t2-t1;//兩個Time類物件相減
t3.print_24();
cout<<"\nt1-70:";
t3=t1-70;//Time類物件減去70秒
t3.print_24();
return 0;
}

【樣例輸出】
t1+t2:15:57:34
t1+65:02:35:05
65+t1:02:35:05
t2-t1:10:49:34
t1-70:02:32:50

#include <iostream>
#include <iomanip>
#include <math.h>
using namespace std;

class Time
{
private:
    int hour,minute,second;
public:
    int SecCalc(){ return(hour*60+minute)*60+second; }//返回總秒數
    Time
(int h,int m,int s=0);//建構函式 Time(int s=0);//根據總秒數計算hour、minute、second並構造物件 void SetTime(int h=0,int m=0, int s=0); void print_12();//按12小時格式顯示時間 void print_24();//按24小時格式顯示時間 //過載“+”運算子 //1. 兩個物件相加:兩種實現方法選一種 Time operator+(const Time & t) const;//成員函式 //friend Time operator+(const Time & t1, const Time & t2);//友元函式
//friend Time operator+(Time & t1, Time & t2);//友元函式 //2. 一個表示秒數的int型資料加上一個Time物件:只能用友元函式實現 friend Time operator+(int s, Time & t);//友元函式 //3. Time物件加上int型資料:兩種實現方法選一種 Time operator+(int s);//成員函式 //friend Time operator+(Time & t, int s);//友元函式 //過載“-”運算子 //1. 兩個Time物件進行相減:兩種實現方法選一種 Time operator-(Time & t);//成員函式 //friend Time operator-(Time & t1, Time & t2);//友元函式 //2. Time物件減去一個表示秒數的int型資料:兩種實現方法選一種 Time operator-(int s);//成員函式 //friend Time operator-(Time & t, int s);//友元函式 }; Time::Time(int h,int m,int s)//建構函式 { hour = h; minute = m; second = s; } Time::Time(int s)//根據總秒數計算hour、minute、second並構造物件 { hour = s/3600; minute = (s-hour*3600)/60; second = s-hour*3600-60*minute; } void Time::SetTime(int h,int m, int s) { hour = h; minute = m; second = s; } void Time::print_12()//按12小時格式顯示時間 { if(hour>12) { cout << setw(2) << setfill('0') << hour-12 << ":" << setw(2) << setfill('0') << minute << ":" << setw(2) << setfill('0') << second << " PM"; } else { cout << setw(2) << setfill('0') << hour << ":" << setw(2) << setfill('0') << minute << ":" << setw(2) << setfill('0') << second << " AM"; } } void Time::print_24()//按24小時格式顯示時間 { cout << setw(2) << setfill('0') << hour << ":" << setw(2) << setfill('0') << minute << ":" << setw(2) << setfill('0') << second; } //過載“+”運算子 //1. 兩個物件相加:兩種實現方法選一種 Time Time::operator+(const Time & t) const//成員函式 { //最普通的運算方法 Time tt; tt.second = second+t.second; tt.minute = tt.second/60 + minute + t.minute; tt.second %= 60; tt.hour = tt.minute/60 + hour + t.hour; tt.minute %= 60; tt.hour %= 24; return tt; } /* Time operator+(const Time & t1, const Time & t2)//友元函式 { //最普通的運算方法 Time tt; tt.second = t1.second+t2.second; tt.minute = tt.second/60 + t1.minute + t2.minute; tt.second %= 60; tt.hour = tt.minute/60 + t1.hour + t2.hour; tt.minute %= 60; tt.hour %= 24; return tt; } Time operator+(Time & t1, Time & t2)//友元函式 { //利用提供的SecCalc()函式 int s = t1.SecCalc() + t2.SecCalc(); Time tt(s); return tt; } */ //2. 一個表示秒數的int型資料加上一個Time物件:只能用友元函式實現 Time operator+(int s, Time & t)//友元函式 { s += t.SecCalc(); Time tt(s); return tt; } /* Time operator+(int s, Time & t)//友元函式 { //利用秒數建構函式和前面剛定義的兩個物件的加法 Time tt(s); return tt+t; } */ //3. Time物件加上int型資料:兩種實現方法選一種 Time Time::operator+(int s)//成員函式 { s += this->SecCalc(); Time tt(s); return tt; } /* Time operator+(Time & t, int s)//友元函式 { s += t.SecCalc(); Time tt(s); return tt; } */ //過載“-”運算子 //1. 兩個Time物件進行相減:兩種實現方法選一種 Time Time::operator-(Time & t)//成員函式 { int s = fabs( this->SecCalc() - t.SecCalc() ); Time tt(s); return tt; } /* Time operator-(Time & t1, Time & t2)//友元函式 { int s = fabs( t1.SecCalc() - t2.SecCalc() ); Time tt(s); return tt; } */ //2. Time物件減去一個表示秒數的int型資料:兩種實現方法選一種 Time Time::operator-(int s)//成員函式 { s = fabs( this->SecCalc() - s ); Time tt(s); return tt; } /* Time operator-(Time & t, int s)//友元函式 { s = fabs( s - t.SecCalc() ); Time tt(s); return tt; } */ int main() { Time t1(2,34),t2,t3; t2.SetTime(13,23,34); cout<<"t1+t2:"; t3=t1+t2;//兩個Time類物件相加 t3.print_24(); cout<<"\nt1+65:"; t3=t1+65;//Time類物件加上65秒 t3.print_24(); cout<<"\n65+t1:"; t3=65+t1;//65秒加上Time類物件 t3.print_24(); cout<<"\nt2-t1:"; t3=t2-t1;//兩個Time類物件相減 t3.print_24(); cout<<"\nt1-70:"; t3=t1-70;//Time類物件減去70秒 t3.print_24(); return 0; }