题目描述
设计一个类来实现手机的功能。它包含私有属性:号码类型、号码、号码状态、停机日期;包含方法:构造、拷贝构造、打印、停机。
1、号码类型表示用户类别,只用单个字母,A表示机构,B表示企业、C表示个人
2、号码是11位整数,用一个字符串表示
3、号码状态用一个数字表示,1、2、3分别表示在用、未用、停用
4、停机日期是一个日期对象指针,在初始化时该成员指向空,该日期类包含私有属性年月日,以及构造函数和打印函数等
----------------------------------------
5、构造函数的作用就是接受外来参数,并设置各个属性值,并输出提示信息,看示例输出
6、拷贝构造的作用是复制已有对象的信息,并输出提示信息,看示例输出。
想一下停机日期该如何复制,没有停机如何复制??已经停机又如何复制??
7、打印功能是把对象的所有属性都输出,输出格式看示例
8、停机功能是停用当前号码,参数是停机日期,无返回值,操作是把状态改成停用,并停机日期指针创建为动态对象,并根据参数来设置停机日期,最后输出提示信息,看示例输出
-------------------------------------------
要求:在主函数中实现号码备份的功能,对已有的虚拟手机号的所有信息进行复制,并将号码类型改成D表示备份;将手机号码末尾加字母X
输入
第一行输入t表示有t个号码
第二行输入6个参数,包括号码类型、号码、状态、停机的年、月、日,用空格隔开
依次输入t行
输出
每个示例输出三行,依次输出原号码信息、备份号码信息和原号码停机后的信息
每个示例之间用短划线(四个)分割开,看示例输出
输入样例1
2 A 15712345678 1 2015 1 1 B 13287654321 2 2012 12 12
输出样例1
Construct a new phone 15712345678 类型=机构||号码=15712345678||State=在用 Construct a copy of phone 15712345678 类型=备份||号码=15712345678X||State=在用 Stop the phone 15712345678 类型=机构||号码=15712345678||State=停用 ||停机日期=2015.1.1 ---- Construct a new phone 13287654321 类型=企业||号码=13287654321||State=未用 Construct a copy of phone 13287654321 类型=备份||号码=13287654321X||State=未用 Stop the phone 13287654321 类型=企业||号码=13287654321||State=停用 ||停机日期=2012.12.12 ----
思路分析
题目文字很多,在打代码的过程中发现一些问题,这里说一下。
题目说停机日期是一个日期对象指针,在初始化时该成员指向空,这里很重要,因为一个空指针很招事。
说这个日期类也要有构造函数,还必须是接受外来参数,并设置各个属性值,这里似乎也没有问题,对吧。
但来手机类的拷贝构造函数时,问题出现了,这个停机日期怎么复制,它只是一个指针,还有可能是一个空指针,那么我们只能在它不是空指针的时候给它复制吧,这又涉及到了一个问题,对于一个指针,怎么样达到复制的目的?唉,这不是直接用赋值运算符=就完事了吗?好了,这操作叫浅拷贝,如果这样做的话,表面上来看的话,似乎也达到了复制目的,但实际上更应该叫共用而不是复制,因为它们两个指向了同一块内存。所以我们需要复制的是指针指向的内容而不是指针本身,这叫深拷贝,这意味着我们首先需要申请堆内存,然后复制内容。
好了,最意外的事情又发生了,申请堆内存的语句报错了!!!
我们前面强调到这个日期类的构造函数是带参数的,所以在new一个日期类对象的时候就要传入参数,问题又来了,还需要注意你的日期类成员函数可以返回私有数据成员。
好像还要在手机号末尾插入一个X,我们用的是string类,所以用insert函数在末尾插进去完事。
AC代码
代码语言:javascript复制#include<iostream>
#include<string>
using namespace std;
class date
{
private:
int year,month,day;
public:
date(int year,int month,int day):year(year),month(month),day(day){}
void print()
{
cout<<year<<'.'<<month<<'.'<<day<<endl;
}
int Year()
{
return year;
}
int Month()
{
return month;
}
int Day()
{
return day;
}
};
class phone
{
private:
string kind,num;
int state;
date *time=NULL;
public:
phone(string kind,string num,int state):kind(kind),num(num),state(state){cout<<"Construct a new phone "<<num<<endl;print();}
phone(phone & mi)
{
kind='D';
num=mi.num;
cout<<"Construct a copy of phone "<<num<<endl;
num.insert(num.end(),'X');
state=mi.state;
if(mi.time)
{
time=new date(mi.time->Year(),mi.time->Month(),mi.time->Day());
}
print();
}
void print()
{
string State[3]={"在用","未用","停用"};
string Kind[4]={"A","B","C","D"};
if(kind==Kind[0])
cout<<"类型=机构||";
else if(kind==Kind[1])
cout<<"类型=企业||";
else if(kind==Kind[2])
cout<<"类型=个人||";
else
cout<<"类型=备份||";
cout<<"号码="<<num<<"||State="<<State[state-1];
if(time)
{
cout<<" ||停机日期=";
time->print();
}
else
cout<<endl;
}
void stop(date time)
{
state=3;
this->time=new date(time.Year(),time.Month(),time.Day());
cout<<"Stop the phone "<<num<<endl;
print();
}
~phone()
{
if(time)
delete time;
}
};
int main()
{
int t,year,month,day,state;
string kind,num;
cin>>t;
while(t--)
{
cin>>kind>>num>>state>>year>>month>>day;
date time(year,month,day);
phone mi(kind,num,state);
phone redmi(mi);
mi.stop(time);
cout<<"----"<<endl;
}
return 0;
}