二、成员转换函数
成员转换函数把该类的对象转换为其他数据类型的对象。在成员转换函数的声明中要用到关键字operator。这样声明一个成员转换函数:
operator aaa();
在这个例子中,aaa就是要转换成的数据类型的说明符。这里的类型说明符可以是任何合法的C++类型,包括其他的类。如下来定义成员转换函数;
Classname::operator aaa()
类名标识符是声明了该函数的类的类型说明符。上面定义的Date类并不能把该类的对象转换回time_t型变量,但可以把它转换成一个长整型值,计算从2000年1月1日到现在的天数。
#include iostream.h
class Date
{
int mo,da,yr;
public:
Date(int m,int d,int y) {mo=m; da=d; yr=y;}
operator int(); //声明
};
Date::operator int() //定义
{
static int dys[]={31,28,31,30,31,30,31,31,30,31,30,31};
int days=yr-2000;
days*=365;
days+=(yr-2000)/4;
for(int i=0;i days+=dys[i];
days+=da;
return days;
}
int main()
{
Date now(12,24,2003);
int since=now;
cout< return 0;
}
三、类的转换
上面两个例子都是C++类对象和内部数据对象之间的相互转换。也可以定义转换函数来实现两个类对象之间的相互转换。
#include iostream.h
class CustomDate
{
public:
int da, yr;
CustomDate(int d=0,int y=0) {da=d; yr=y;}
void display()
{
cout< }
};
class Date
{
int mo, da, yr;
public:
Date(int m=0,int d=0,int y=0) {mo=m; da=d; yr=y;}
Date(const CustomDate&); //转换构造函数
operator CustomDate(); //成员转换函数
void display()
{
cout< }
};
static int dys[] = {31,28,31,30,31,30,31,31,30,31,30,31};
Date::Date(const CustomDate& jd)
{
yr=jd.yr;
da=jd.da;
for(mo=0;mo<11;mo++)
if(da>dys[mo]) da-=dys[mo];
else break;
mo++;
}
Date::operator CustomDate()
{
CustomDate cd(0,yr);
for(int i=0;i cd.da+=da;
return cd;
}
int main()
{
Date dt(12,24,3);
CustomDate cd;
cd = dt; //调用成员转换函数
cd.display();
dt = cd; //调用转换构造函数
dt.display();
return 0;
}
这个例子中有两个类CustomDate和Date,CustomDate型日期包含年份和天数。
这个例子没有考虑闰年情况。但是在实际构造一个类时,应该考虑到所有问题的可能性。
在Date里中具有两种转换函数,这样,当需要从Date型变为CustomDate型十,可以调用成员转换函数;反之可以调用转换构造函数。
不能既在Date类中定义成员转换函数,又在CustomDate类里定义转换构造函数。那样编译器在进行转换时就不知道该调用哪一个函数,从而出错。
微信搜索"考试吧"了解更多考试资讯、下载备考资料
相关推荐: