- 枚举类型
枚举(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);//正确