c++作业3-F(1390)时间类的常量

Problem F: 时间类的常量

Time Limit: 4 Sec  Memory Limit: 128 MB
Submit: 5927  Solved: 4758
[Submit][Status]

Description

封装一个时间类Time,用于时间处理的相关功能,支持以下操作:

1. Time::Time()无参构造方法。

2. Time::Time(int,int,int)构造方法:传递时分秒的三个参数构造对象。

3. Time::Time(const T&)拷贝构造方法。

4. 成员读函数:

   Time::hour()  :返回Time的小时数;

   Time::minute():返回Time的分钟数;

   Time::second():返回Time的秒数。

5. 成员写函数:

   Time::hour(int)  :传参修改Time的小时数;

   Time::minute(int):传参修改Time的分钟数;

   Time::second(int):传参修改Time的秒数。

6. 对象整体读写方法:

   Time::setTime(int,int,int)方法:传递时分秒三个参数修改Time对象的时分秒数。该方法返回修改后的对象。

   Time::setTime(const T&)方法:传递一个参数修改Time对象的时分秒数。该方法返回修改后的对象。

   Time::getTime()方法:返回对象自身的引用。其实,t.getTime()即t。

   仅在Time类中的Time::getTime()方法实在是多余,在组合或者继承关系时才会有机会用到。

7. Time::inputTime()方法:按格式从标准输入读取数据修改Time对象的时分秒数值。该方法返回修改后的对象。

8. Time::showTime()方法:输出“hh:mm:ss”,不足两位的要前面补0。如果对象不是合法的时间,则输出“Time error”。

注意:为了保证Time类的常量对象能够正确的调用Time类的方法,那些不修改对象数据成员的函数都应该是常量成员函数,在返回对象自身的引用时也应返回常量引用。

你设计一个时间类Time,使得main()函数能够正确运行。

函数调用格式见append.cc。

append.cc中已给出main()函数。main()函数内容稍微繁复,仅为测试对象的各种调用情况。

 

Input

输入的第一个整数n,表示有n组测试数据,每组3个整数:hh,mm,ss,分别表示时、分、秒,其值都在int范围内。

 

Output

开始部分为由main()函数产生的固定输出,用于测试对象的某些方法的调用情况。输出“Test data output :”之后为测试数据对应的输出:

每组测试数据对应一组输出“hh:mm:ss”,不足两位的输出需要前面补0。如果输入的时间不合法,则输出“Time error”。格式见sample。

 

Sample Input

6 0 0 1 0 59 59 1 1 60 23 0 0 23 59 59 24 1 0

Sample Output

Constant test output : 00:00:00 01:02:03 Time error Test data output : 00:00:01 00:59:59 Time error 23:00:00 23:59:59 Time error

HINT

输出格式用头文件<iomanip>中流操作算子:

setw(w)   :设置数据的输出宽度为w个字符

setfill(c):设置用字符c作为填充字符

Append Code

append.cc,

int main()
{
    cout<<"Constant test output :"<<endl;
    const Time c;
    const Time cc(1, 2, 3);
    const Time ccc(23, 60, 60);
    cout<<setw(2)<<setfill('0')<<c.hour()<<":";
    cout<<setw(2)<<setfill('0')<<c.minute()<<":";
    cout<<setw(2)<<setfill('0')<<c.second()<<endl;
    cc.getTime().showTime();
    ccc.showTime();
 
    cout<<"\nTest data output :"<<endl;
    Time t;
    int cases;
    cin>>cases;
    for(int i = 1; i <= cases; ++i)
    {
        if(i % 4 == 0)
        {
            int hour, minute, second;
            cin>>hour>>minute>>second;
            Time tt(hour, minute, second);
            tt.showTime();
        }
        if(i % 4 == 1)
        {
            int hour, minute, second;
            cin>>hour>>minute>>second;
            t.setTime(hour, minute, second).showTime();
        }
        if(i % 4 == 2)
            t.inputTime().showTime();
        if(i % 4 == 3)
        {
            int hour, minute, second;
            cin>>hour>>minute>>second;
            t.hour(hour);
            t.minute(minute);
            t.second(second);
            t.showTime();
        }
    }
}

答案:

#include <iostream>
#include <iomanip>
using namespace std;
class Time
{
private:
    int hh,mm,ss;
    int h,m,s;
public:
    Time(){hh=0;mm=0;ss=0;}
    Time(int h,int m,int s):hh(h),mm(m),ss(s){}
    Time(const Time& p)
    {
        hh=p.hh;
        mm=p.mm;
        ss=p.ss;
    }
    int hour()const{return hh; }
    int minute()const{return mm;}
    int second()const{return ss;}
    void hour(int h){hh=h;}
    void minute(int m){mm=m;}
    void second(int s){ss=s;}
    Time& setTime(int h,int m,int s)
    {
        hh=h;
        mm=m;
        ss=s;
        return *this;
    }
    Time& setTime(const Time& p)
    {
        hh=p.hh;
        mm=p.mm;
        ss=p.ss;
        return *this;
    }
   const Time& getTime()const { return *this;}
    Time& inputTime()
    {
        cin>>h>>m>>s;
        hh=h;
        mm=m;
        ss=s;
        return *this;
    }
    void showTime()const
    {
        if(hh>=0&&hh<24&&mm>=0&&mm<60&&ss>=0&&ss<60)
            cout<<setfill('0')<<setw(2)<<hh<<":"<<setfill('0')<<setw(2)<<mm<<":"<<setfill('0')<<setw(2)<<ss<< endl;
        else
            cout<<"Time error"<<endl;
    }

};
int main()
{
    cout<<"Constant test output :"<<endl;
    const Time c;
    const Time cc(1, 2, 3);
    const Time ccc(23, 60, 60);
    cout<<setw(2)<<setfill('0')<<c.hour()<<":";
    cout<<setw(2)<<setfill('0')<<c.minute()<<":";
    cout<<setw(2)<<setfill('0')<<c.second()<<endl;
    cc.getTime().showTime();
    ccc.showTime();

    cout<<"\nTest data output :"<<endl;
    Time t;
    int cases;
    cin>>cases;
    for(int i = 1; i <= cases; ++i)
    {
        if(i % 4 == 0)
        {
            int hour, minute, second;
            cin>>hour>>minute>>second;
            Time tt(hour, minute, second);
            tt.showTime();
        }
        if(i % 4 == 1)
        {
            int hour, minute, second;
            cin>>hour>>minute>>second;
            t.setTime(hour, minute, second).showTime();
        }
        if(i % 4 == 2)
            t.inputTime().showTime();
        if(i % 4 == 3)
        {
            int hour, minute, second;
            cin>>hour>>minute>>second;
            t.hour(hour);
            t.minute(minute);
            t.second(second);
            t.showTime();
        }
    }
}

分析:

1.常量成员函数

定义

在C++编程中,关键字const不仅可以用来定义“常量对象”,还可以用来修饰一个类的成员函数和数据成员,分别称为“常量对象”、“常量成员函数”和“常量数据成员”。

如果声明类的成员函数时,在末尾加上const修饰,则该成员函数称为类的常量成员函数。常量成员函数的定义如下:

<返回类型> 成员函数名(参数表) const [1]

 

 

性质

①常量成员函数与普通成员函数一样,其由函数头和函数体组成的定义部分既可以写在类体内,也可以写在类体外;

②定义一个常量成员函数实质上是把this指针在该成员函数内定义成指向常量的常量指针,由此,常量成员函数体内this指针不能重新定向,它总是指向调用该常量成员函数的对象,而且,该对象的数据成员也不可以被修改。 [1]

 

 

使用方法

①常量对象只能调用它的常量成员函数,而不能调用普通成员函数;

②普通对象既可以调用常量成员函数,也可以调用普通成员函数;

③普通成员函数可以访问本类的常量成员函数;

④常量成员函数不能访问本类的普通成员函数;

⑤如果常量成员函数与普通成员函数同名,即构成了重载成员函数,那么,常量对象调用常量成员函数,普通对象调用普通成员函数。 (百度词条)

 

2.关于const是否保持一致的错因分析:

21.出现error: binding 'const xxxx' to reference of type 'xxxx&' discards qualifiers(将“const-time”绑定到类型为“time&”的discards限定符的引用)的一种可能原因是函数参数使用的是加const修饰的,但你定义的的成员变量或函数返回值没加const修饰。(写有关const的函数时须注意函数参数,成员变量,函数返回值类型都要加const,保持一致)

原因如下:

#include<iostream>
int main()
{
	//情况一,报错
    const int a = 1;
   	 int & b1 = a;  
   	 const int & b2 = a;
   	 //情况二,没有报错
   	 const int& c=1;
   	 int d=c;
}

a是不能改的,b1指向a,b1是int&,能修改,这样就让编译器难做了,所以这是有矛盾的!!
所以b1的初始化就错了!!
b2不能改,a也是不能改,b2的初始化就没毛病!!
然后d的初始化也只是普通int的复制,没毛病

要想解决第6行的报错,要么把b1声明为const,保证对b1的操作不影响a,要么就不要把a声明为const
————————————————
版权声明:本文为CSDN博主「阿维的博客日记」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_46028606/article/details/105748895

 

22.error: passing ‘const xxx’ as ‘this’ argument discards qualifiers [-fpermissive](错误:将“const xxx”作为“this”参数传递会丢弃限定词。)可能原因是报错的行的参数是const(常量)而所调用的函数是非const的。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值