时间类的改进(运算符重载)

版权声明:本文为博主原创,未经博主允许不得转载 https://blog.csdn.net/Sherry_Yue/article/details/85306257

【问题描述】
对前面实验写过的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;
}

猜你喜欢

转载自blog.csdn.net/Sherry_Yue/article/details/85306257
今日推荐