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
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的。