enum类型的重载操作

ZDNet软件频道 时间:2003-07-14 作者:ZDNet China |  我要评论()
本文关键词:cpptips
C++至少需要将一个重载操作的操作对象做为用户自定义类型。这个自定义类型不必是一个完整的类,但一定要是enum类型。
本文译自Builder.com,未经许可请勿转载C++至少需要将一个重载操作的操作对象做为用户自定义类型。这个自定义类型不必是一个完整的类,但一定要是enum类型。

对于一个enum类型来说,重载操作符++和--是非常有用的。因为这种类型允许你通过计数器进行迭代,就好像把它当作普通的整数一样。我们来举个enum类型的例子:

enum Days {
 Mon,
 Tue,
 Wed,
 Thur,
 Fri,
 Sat,
 Sun
};

如果我们想显示每个计数器里的数值,我们可以这样做:

#include <iostream>
int main()
{
  Days day = Mon;
  for (int n=0; n<7; ++n) /* display days as int's */
  {
    std::cout << day << std::endl;
    ++day;
  }
}

也许让你很吃惊的是,尽管没有定义使用操作数++的重载方式,但这个程序依然可以通过编译,然后正常的运行。这是因为C++将enum类型的day强制转换成了int类型并且利用嵌入式的++增加它的值。在下面的例子中很清楚的展示我们是怎么达到目的的。

但是,请思考一下如果将for循环做一个小小的变化,整个程序将会发生怎样的变化。

for (int n=0; n<14; ++n) /* display days as int's */
 {
   std::cout << day << std::endl;
   ++day;
 }
}

当程序进行第七次叠加的时候,循环显示出了非法的数值:8,9,10……在第七次叠加后,我们希望看到循环翻转,而不是无止境的增加天数,那就是说希望值是1,2,3……6,0,1……为了让程序达到这个性能,我们需要定义一个重载操作符++,如下:

Days & operator++(Days & d) //prefix ++
{
  if (d == Sun)
    return d = Mon; // rollover
  int temp = d;
  return d = static_cast <Days>  (++temp);
}

int main()
{
  Days day = Mon;
  for (int n=0; n<14; ++n) // display days as int's
  {
    std::cout << day << std::endl;
    ++day;
  }
}

注意,你可以选择操作符++的重载方式:前缀或者后缀。如果采用后缀方式则要在强制性的参数后使用一个int类型的空参数。



责任编辑:炒饭

欢迎评论或投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134