前言
"打牢基础,万事不愁" .C++的基础语法的学习."学以致用,边学边用",编程是实践性很强的技术,在运用中理解,总结.
引入
C++基础语法:枚举_枚举法基础 c++-CSDN博客前面写过一篇和枚举相关的帖子,这篇将类作用域内枚举再做个说明
枚举回顾
枚举有三种形式: 符号常量集合, 无类作用域枚举,类作用域枚举 .其中符号常量集合可以完全替代常量(一般是整型常量),后两种被看作自建的新数据类型.
三种枚举的区别:
常量型枚举,无变量,可直接赋值整型变量;
无作用域型枚举,有变量,能直接赋值整型变量;
作用域型枚举,有变量,不能直接赋值整型变量;
无类域枚举和类域枚举作为一种数据类型,有类型,变量和值这三要素.枚举的特点是每种枚举的取值已被限定,且值和整型常量可以互相转换.常量型枚举和无类域枚举可以直接转成整型常量,类域枚举需要强转(但不一定使用)
常量型枚举和无类域枚举举例:
#include<iostream>
using namespace std;
enum { MAX = 500 };
enum SIZE { SMALL = 100, MIDDLE = 200, BIG = 300 };
int main(void) {
int max = MAX; //枚举赋值整型变量
SIZE size = SIZE::SMALL; //不推荐使用
int isize = size; //无类域枚举赋值整型变量
cout << "最大值:" << max << endl;
cout << "尺寸:" << isize << endl;
}
注意:如果文件里有同名的无类域枚举值,不被编译器识别,所以不推荐使用.
类域枚举
下面有个DemoApple类,用枚举表示苹果的产地和颜色
/*枚举的变量声明和枚举值的访问,注意加上作用域名称*/
#include<iostream>
using namespace std;
class DemoApple { //苹果类
public:
enum { WEIGHT = 500 }; //重量
enum District { SD, SX }; //产地
enum class Color { RED, GREEN, BLUE }; //颜色
private:
int weight;
District district; //产地标识
Color color; //颜色标识
public:
DemoApple(District ds=SD,Color col= DemoApple::Color::RED, int we = WEIGHT){
district = ds;
color = col;
weight = we;
}
int getWeight() { return weight; } //获得重量
District getDistrict() const{ return district; }//接口函数,访问对象产地
Color getColor() const{ return color; } //接口函数,访问对象颜色
};
测试代码:
int main(void) {
DemoApple da = DemoApple();
cout << "默认苹果重量为:"<<da.getWeight()<<"克" << endl;
DemoApple::Color color=da.getColor(); //访问对象颜色
if (color == DemoApple::Color::RED)
cout << "默认苹果是红色" << endl;
//若枚举类型声明放在私有部分,则下面对象无法建立.必须放在public中
DemoApple da1 = DemoApple(DemoApple::SX, DemoApple::Color::GREEN,600);
cout << "苹果重量为:" << da1.getWeight() << "克" << endl;
DemoApple::District ds = da1.getDistrict(); //访问对象产地
if (ds == DemoApple::SD)
cout << "苹果产地山东" << endl;
else
cout << "苹果产地山西" << endl;
int dweight = DemoApple::WEIGHT; //常量枚举访问
int ddistrict = DemoApple::SD; //无类域枚举访问
cout << "默认重量为:" <<dweight<< endl;
cout << "默认产地为:" << ddistrict<<endl;
DemoApple::Color col = DemoApple::Color::BLUE;
int ccol = (int)col; //可强转为整型
cout << "默认颜色为:" << ccol << endl;
}
----说明:分别用到了常量枚举WEIGHT,无类域枚举District和类域枚举Color
注意:
1.想在类外访问枚举类型,声明要放在public中
2.在类外声明枚举变量和使用枚举值时,前面要加上作用域名,包括命名空间和类空间.这里因为没有使用命名空间,所以前面只加上类名DemoApple
思考:枚举是否必要
枚举并不是必须使用的,比如在本例中,可以用int district表示产地,0表示山东,1表示山西;也可以用int color表示颜色,0表示红色,1表示绿色,2表示蓝色.优点是写法简单,缺点是对程序员以外的使用者不太友好.
在大型程序中,枚举用得很广泛
枚举的使用步骤
1.声明枚举,定义枚举值
如果在类外访问,放到public中,不想被访问放到private中.public中的枚举建议使用类域枚举,以避免文件中的枚举值冲突;private中的枚举建议使用无类域枚举(因为没有枚举值冲突的担心),也可以把这作为一种程序的"潜在规则".
在<C++ Prime Plus> 6th Edition的P400有个例子,在public中使用无类域枚举,但他的类外有个命名空间,相当于加上了作用域.
2.在类属性中声明枚举变量,做某个变量或者对象的状态标识
3.提供接口函数,方便外界查询变量或对象状态.
小结
枚举作为一种特殊的自定义数据类型,他的值由程序员定义,枚举值和整型常量有一定关系
枚举适合做变量或对象的标识,使程序的可读性增强