第八周【项目2-Time类中的运算符重载】

本文详细介绍了如何在C++中实现时间类的运算符重载,包括比较运算符、加减运算符及赋值运算符的实现,并通过示例代码展示了其实现过程。通过这种方式,开发者可以更灵活地操作时间数据,提高代码的可读性和实用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现Time类中的运算符重载。

class CTime 

private: 

   unsigned short int hour;    // 时 

   unsigned short int minute;  // 分 

   unsigned short int second;  // 秒 

public: 

   CTime(int h=0,int m=0,int s=0); 

   void setTime(int h,int m,int s); 

   void display(); 

   //二目的比较运算符重载 

   bool operator > (CTime &t); 

   bool operator < (CTime &t); 

    booloperator >= (CTime &t); 

   bool operator <= (CTime &t); 

   bool operator == (CTime &t); 

   bool operator != (CTime &t); 

   //二目的加减运算符的重载 

   //返回t规定的时、分、秒后的时间 

   //例t1(8,20,25),t2(11,20,50),t1+t2为19:41:15 

   CTime operator+(CTime &t); 

   CTime operator-(CTime &t);//对照+理解 

   CTime operator+(int s);//返回s秒后的时间 

   CTime operator-(int s);//返回s秒前的时间 

   //二目赋值运算符的重载 

   CTime operator+=(CTime &c); 

   CTime operator-=(CTime &c); 

   CTime operator+=(int s);//返回s秒后的时间 

    CTime operator-=(int s);//返回s秒前的时间 

}; 

提示1:并不是所有比较运算重载函数都很复杂

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片

//比较运算返回的是比较结果,是bool型的true或false 

//可以直接使用已经重载了的运算实现新运算,例如果已经实现了 > ,则实现 <= 就可以很方便了…… 

bool CTime::operator <= (CTime &t)// 判断时间t1<=t2 

   if (*this > t) return false; 

   return true; 

甚至可以如下面的代码般简练:

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片

bool CTime::operator <= (CTime&t) 

   return !(*this > t) 

提示2:并不是所有复合赋值运算重载函数都需要很复杂

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片

//可以直接使用已经重载了的加减运算实现 

//这种赋值, 例如 t1+=20,直接改变当前对象的值,所以在运算完成后,将*this作为返回值 

CTime CTime::operator+=(CTime &c) 

   *this=*this+c; 

   return *this; 

提示3:请自行编制用于测试的main()函数,有些结果不必依赖display()函数,提倡用单步执行查看结果

 

[参考解答]

#include <iostream>
using namespace std;
class CTime
{
private:
    unsigned short int hour;    // 时
    unsigned short int minute;  // 分
    unsigned short int second;  // 秒
public:
    CTime(int h=0,int m=0,int s=0);
    void setTime(int h,int m,int s);
    void display();
    //二目的比较运算符重载
    bool operator > (CTime &t);
    bool operator < (CTime &t);
    bool operator >= (CTime &t);
    bool operator <= (CTime &t);
    bool operator == (CTime &t);
    bool operator != (CTime &t);
    //二目的加减运算符的重载
    //返回t规定的时、分、秒后的时间
    //例t1(8,20,25),t2(11,20,50),t1+t2为19:41:15
    CTime operator+(CTime &t);
    CTime operator-(CTime &t);//对照+理解
    CTime operator+(int s);//返回s秒后的时间
    CTime operator-(int s);//返回s秒前的时间
    //二目赋值运算符的重载
    CTime operator+=(CTime &c);
    CTime operator-=(CTime &c);
    CTime operator+=(int s);//返回s秒后的时间
    CTime operator-=(int s);//返回s秒前的时间
};
CTime::CTime(int h,int m,int s)
{
    hour=h;
    minute=m;
    second=s;
}
void CTime::display()
{
    cout<<hour<<":"<<minute<<":"<<second<<endl;
}
void CTime::setTime(int h,int m,int s)
{
    hour=h;
    minute=m;
    second=s;
}
CTime CTime::operator-=(CTime &c)
{

    hour-=c.hour;
    minute-=c.minute;
    second-=c.second;
    if(second<0)
    {
        second+=(-second/60*60+60);
        minute-=(-second/60+1+c.minute);
    }
    if(minute<0)
    {
        minute+=(-minute/60*60+60);
        hour-=(-minute/60+1+c.hour);
    }
    if(hour<0)
    {
        hour+=(-hour/24+24);
    }
    return (*this);
}
CTime CTime::operator+=(CTime &c)
{
    hour+=c.hour;
    minute+=c.minute;
    second+=c.second;
    if(second>59)
    {
        second-=second/60*60;
        minute+=second/60+c.minute;
    }
    if(minute>59)
    {
        minute-=minute/60*60;
        hour+=c.minute/60*60+c.hour;
    }
    if(hour>23)
    {
        hour%=24;
    }
    return (*this);
}
CTime CTime::operator-=(int s)
{
    second-=s;
    if(second<0)
    {
        minute-=(-second/60+1);
        second+=(-second/60*60+60);
    }
    if(minute<0)
    {
        hour-=(-minute/60+1);
        minute+=(-minute/60*60+60);
    }
    if(hour<0)
        hour+=(-hour/24*24+24);
    return (*this);
}
CTime CTime::operator+=(int s)
{
    second+=s;
    if(second>59)
    {
        minute+=(second/60);
        second-=(second/60*60);
    }
    if(minute>59)
    {
        hour+=(minute/60);
        minute-=(minute/60*60);
    }
    if(hour>23)
        hour%=24;
    return (*this);
}
CTime CTime::operator-(int s)
{
    second-=s;
    if(second<0)
    {
        minute-=(-second/60+1);
        second+=(-second/60*60+60);
    }
    if(minute<0)
    {
        hour-=(-minute/60+1);
        minute+=(-minute/60*60+60);
    }
    if(hour<0)
        hour+=(-minute/60*24+24);
    return (*this);
}
CTime CTime::operator+(int s)
{
    second+=s;
    if(second>59)
    {
        minute+=(second/60);
        second-=(second/60*60);
    }
    if(minute>59)
    {
        hour+=(minute/60);
        minute-=(minute/60*60);
    }
    if(hour>23)
        hour%=24;
    return (*this);
}
CTime CTime::operator-(CTime &t)
{
    hour-=t.hour;
    minute-=t.minute;
    second-=t.second;
    if(second<0)
    {
        minute-=(-second/60+1);
        second+=(-second/60*60+60);
    }
    if(minute<0)
    {
        hour-=(-minute/60+1);
        minute+=(-minute/60*60+60);
    }
    if(hour<0)
        hour+=(-hour/24*24+24);

    return (*this);
}
CTime CTime::operator+(CTime &t)
{
    hour+=t.hour;
    minute+=t.minute;
    second+=t.second;
    if(second>59)
    {
        second-=second/60*60;
        minute+=second/60+t.minute;
    }
    if(minute>59)
    {
        minute-=minute/60*60;
        hour+=t.minute/60*60+t.hour;
    }
    if(hour>23)
    {
        hour%=24;
    }
    return (*this);
}
bool CTime::operator != (CTime &t)
{
    if(hour!=t.hour)
        return true;
    else if(minute!=t.minute)
        return true;
    else if(second!=second)
        return true;
    else return false;
}
bool CTime::operator==(CTime &t)
{
    if((hour==t.hour)&&(minute==t.minute)&&(minute==t.minute))
        return true;
    else return false;
}
bool CTime::operator <= (CTime &t)
{
    bool flags=false;
    if((*this)==t)
        flags=true;
    else if((*this)<t)flags=true;
    return flags;
}
bool CTime::operator >= (CTime &t)
{
    if((*this)==t)
        return true;
    else if((*this)>t)
        return true;

}
bool CTime::operator < (CTime &t)
{
    bool flags=false;
    if(hour<t.hour)
        flags=true;
    else if(hour==t.hour)
        if(minute<t.minute)
            flags=true;
        else if(minute==t.minute)
            if(second<t.second)
                flags=true;
    return flags;
}
bool CTime::operator > (CTime &t)
{
    bool flags=false;
    if(hour>t.hour)flags=true;
    else   if(hour==t.hour) if(minute>t.minute)flags=true;
        else if(minute==t.minute) if(second>t.second)flags=true;
    return flags;
}
int main()
{
    CTime t1(23,45,36),
          t2(12,56,36),
          t3(11,34,3),t4(9,2,3),
          t5(1,2,3),t6(1,2,3),t7,t8,t9;
    if(t1>t2)cout<<"t1>t2  "<<"Y"<<endl;
    else cout<<"t1>t2  "<<"N"<<endl;
    if(t1<t2)cout<<"t1<t2  "<<"Y"<<endl;
    else cout<<"t1<t2  "<<"N"<<endl;
    if(t1>=t2)cout<<"t1>=t2  "<<"Y"<<endl;
    else cout<<"t1>=t2  "<<"N"<<endl;
    if(t1<=t2)cout<<"t1<=t2  "<<"Y"<<endl;
    else cout<<"t1<=t2  "<<"N"<<endl;
    if(t5>=t6)cout<<"t5>=t6  "<<"Y"<<endl;
    else cout<<"t5>=t6  "<<"N"<<endl;
    if(t3==t6)cout<<"t3=t6  "<<"Y"<<endl;
    else cout<<"t5>=t6  "<<"N"<<endl;
    t7=t1+t2;
    t8=t3-t4;
    t9=t5-t6;
    cout<<"t1+t2=";
    t7.display();
    cout<<"t3-t4=";
    t8.display();
    cout<<"t5-t6=";
    t9.display();
    return 0;
}

测试图:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值