07-拷贝构造函数与复合类
题目描述
定义一个电话号码类CTelNumber,包含1个字符指针数据成员,以及构造、析构、打印及拷贝构造函数。
字符指针是用于动态创建一个字符数组,然后保存外来输入的电话号码
构造函数的功能是为对象设置键盘输入的7位电话号码,
拷贝构造函数的功能是用原来7位号码的对象升位为8位号码对象,也就是说拷贝构造的对象是源对象的升级.电话升位的规则是原2、3、4开头的电话号码前面加8,原5、6、7、8开头的前面加2。
注意:电话号码只能全部是数字字符,且与上述情况不符的输入均为非法)
输入
测试数据的组数
第一个7位号码
第二个7位号码
…
输出
第一个号码升位后的号码
第二个号码升位后的号码
…
如果号码升级不成功,则输出报错信息,具体看示例
输入样例
3
6545889
3335656
565655
26545889
83335656
Illegal phone number
#include<iostream>
#include<cstring>
using namespace std;
class Cphone
{
char *num;
public:
Cphone()//初始化构造
{
*num={0};
}
Cphone(char *n)//构造
{
num=new char[strlen(n)+1];
strcpy(num,n);
}
Cphone(Cphone &ph)//拷贝构造
{
int i,len=strlen(ph.num);
num=new char[strlen(ph.num)+1];
strcpy(num,ph.num);
if(num[0]=='2'||num[0]=='3'||num[0]=='4')
{
for(i=len-1;i>=0;i--)
num[i+1]=num[i];
num[0]='8';
}
else if(num[0]=='5'||num[0]=='6'||num[0]=='7'||num[0]=='8')
{
for(i=len-1;i>=0;i--)
num[i+1]=num[i];
num[0]='2';
}
num[strlen(ph.num)+1]='\0';
}
void print()//输出
{
int i,len=strlen(num);
for(i=0;i<len;i++)
cout<<num[i];
cout<<endl;
}
~Cphone()//析构
{
delete[]num;
}
};
int main()
{
int t;
cin>>t;
while(t--)
{
string n;
cin>>n;
int len=n.length(),i=0,sum=0;
char *n1=new char(len);
for(i=0;i<len;i++)//检测非法输入
{
if(n[i]<'2'||n[i]>'9')
sum++;
}
if(len!=7||n[0]=='9')
sum++;
if(sum!=0)
cout<<"Illegal phone number"<<endl;
else//合法
{
for(i=0;i<len;i++)
n1[i]=n[i];
Cphone ph(n1);
Cphone ph1(ph);
ph1.print();
delete n1;
}
}
return 0;
}
本文介绍了如何定义CTelNumber类,包括构造函数用于输入7位电话号码,拷贝构造函数实现电话号码从7位到8位的升级,同时处理非法输入。通过实例展示了如何使用并检查电话号码的合法性。
2581

被折叠的 条评论
为什么被折叠?



