类相关的技术细节 -14

来源:互联网 发布:simcms二手车2.0 源码 编辑:程序博客网 时间:2024/06/09 15:12
  • 枚举类型
    枚举(enum):
    它指定一个值的集合,这些值用符号常量来表示,称为枚举量。
enum class Month{    jan=1,feb,mar,apr,may,jun,jul,aug,sep,oct,npv,dec    };

可以自定义进行对枚举量进行定义,也可以不指定。如果不指定,则编译器将赋予每个枚举量的值为上一个枚举量的值加1.
如果不对第一个枚举量进行定义,则编译器会从0开始计数。

Month m = Month::feb;Month m2 = feb; //错误,feb不在作用域内m = 7;  //错误,不能对Month赋int值int n = m;  //错误,不能对int赋Month值Month mm = Month(7);    //将整型值转换为Month型再进行赋值

需要注意,Month是一个独立的类型,每个Month值都对应一个相等的整型值,但是很多证性质没有相等的Month值。

  • “平坦”枚举
    使用enum class定义的枚举也被称为“作用域枚举”。
    “平坦”枚举和作用域枚举的区别为,平坦枚举将它的枚举量都隐式导出到枚举类型所在的作用域里,并可以隐式转换到int型。
enum Month{    jan=1,feb,mar,apr,may,jun,jul,aug,sep,oct,npv,dec    };Month m = feb;  //正确,feb在该作用域内Month m2 = Month::feb;  //正确m = 7;  //错误,不能对Month赋int值  int n = m;  正确,可以对int赋Month值(隐式的转换到int)Month mm = Month(7);    //转换int到Month
  • 运算符重载
enum class Month{    jan=1,feb,mar,apr,may,jun,jul,aug,sep,oct,npv,dec    };Month operator++(Month& m)  //  对前缀递增运算符进行重新定义{    m = (m==Dec)?Jan:Month(int(m)+1); //“绕回”    return m;

在进行运算符的重载时,运算对象的数目也也必须和原来一致。比如,可以定义一元的运算符-,但是不能定义一元的<=。可以定义二元的运算符+,但是不能定义二元的!。
一个重载的运算符必须作用于至少一个用户自定义类型的运算对象:

int operator+(int,int);//错误,不能重载内置类型+运算符Vector operator+(const,Vector&,const Vector &);//正确Vector operator+=(const Vector&,int);//正确
原创粉丝点击