2011年计算机等级考试二级C++辅导笔记:类的转换

来源:计算机等级考试    发布时间:2012-08-29    计算机等级考试视频    评论

  C++的内部数据类型遵循隐式类型转换规则。假设某个表达市中使用了一个短整型变量,而编译器根据上下文认为这儿需要是的长整型,则编译器就会根据类型转换规则自动把它转换成长整型,这种隐式转换出现在赋值、参数传递、返回值、初始化和表达式中。我们也可以为类提供相应的转换规则。
  对一个类建立隐式转换规则需要构造一个转换函数,该函数作为类的成员,可以把该类的对象和其他数据类型的对象进行相互转换。声明了转换函数,就告诉了编译器,当根据句法判定需要类型转换时,就调用函数。
  有两种转换函数。一种是转换构造函数;另一种是成员转换函数。需要采用哪种转换函数取决于转换的方向。
  一、转换构造函数
  当一个构造函数仅有一个参数,且该参数是不同于该类的一个数据类型,这样的构造函数就叫转换构造函数。转换构造函数把别的数据类型的对象转换为该类的一个对象。和其他构造函数一样,如果声明类的对象的初始化表同转换构造函数的参数表相匹配,该函数就会被调用。当在需要使用该类的地方使用了别的数据类型,便宜器就会调用转换构造函数进行转换。
  #include iostream.h
  #include time.h
  #include stdio.h
  class Date
  {
  int mo, da, yr;
  public:
  Date(time_t);
  void display();
  };
  void Date::display()
  {
  char year[5];
  if(yr<10)
  sprintf(year,0%d,yr);
  else
  sprintf(year,%d,yr);
  cout< }
  Date::Date(time_t now)
  {
  tm* tim=localtime(&now);
  da=tim->tm_mday;
  mo=tim->tm_mon+1;
  yr=tim->tm_year;
  if(yr>=100) yr-=100;
  }
  int main()
  {
  time_t now=time(0);
  Date dt(now);
  dt.display();
  return 0;
  }
  本程序先调用time()函数来获取当前时间,并把它赋给time_t对象;然后程序通过调用Date类的转换构造函数来创建一个Date对象,该对象由time_t对象转换而来。time_t对象先传递给localtime()函数,然后返回一个指向tm结构(time.h文件中声明)的指针,然后构造函数把结构中的日月年的数值拷贝给Date对象的数据成员,这就完成了从time_t对象到Date对象的转换。
  二、成员转换函数
  成员转换函数把该类的对象转换为其他数据类型的对象。在成员转换函数的声明中要用到关键字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类里定义转换构造函数。那样编译器在进行转换时就不知道该调用哪一个函数,从而出错。

上一页12下一页

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答