跳至正文
View Categories

1 min read

主要内容 #

1. 生活中的分类 #

请问下面的词汇应该归属于什么类?

Sunday Monday Tuesday Wednesday Thursday Friday Saturday

很显然,应该是星期(Weekday)

我们只知道,在 C++ 中可以定义很多数据类型。比如 int char float 等。
那么,我们可以定义“星期类型的变量吗?”

2. 自定义的数据类型 #

1. 举例 #

当然是可以的。请看例程

// 定义一个 WeekDay 类型
enum WeekDay
{
    Sunday,
    Monday,
    Tuesday, 
    Wednesday, 
    Thursday, 
    Friday, 
    Saturday
};

// 定义一个 WeekDay 类型的变量
WeekDay a = WeekDay::Monday;

上面演示的,就是“枚举”类型。也就是自定义的数据类型

小练习,请自定义一个“学科”类型的变量,假设学科有:Chinese, English, Math, C++。

2. 规则 #

  • 1. 枚举类型和枚举值的命名,只能是数字、字母、下划线(与变量定义规则相同)
  • 2. 定义的末尾,有一个分号
  • 3. 枚举值之间,使用逗号间隔。最后一项,可写可不写
  • 4. 枚举的值,相当于整数,可正可负,而且可以指定从起始值,后一个值比前一个大 1
  • 5. 枚举的值,可以当作整数输出
  • 下面详细来看:

    1. 枚举类型和枚举值的命名,只能是数字、字母、下划线(与变量定义规则相同) #
    请问下面的枚举,哪些是错的,并且错在哪里?
    enum WeekDay
    {
        1,
        Monday,
        Monday_2,
        3DASHIMA, 
        _Wednesday, 
        +-/*, 
        , 
        Saturday,
        _123,
        _,
        OK,
        OK
    };

    解答:

    enum WeekDay
    {
        1,         // 不能数字开头
        Monday,
        Monday_2,
        3DASHIMA,  // 不能数字开头
        _Wednesday, 
        +-/*,      // 不能是特殊字符
        ,          // 不能为空
        Saturday,
        _123,
        _,         // 【正确的】
        OK,
        OK         // 不能重复定义
    };
    2. 定义的末尾,有一个分号 #

    请回头看一下我们的例程,注意最后的分号!

    3. 枚举值之间,使用逗号间隔。最后一项,可写可不写 #

    请回头看一下我们的例程,注意最后的分号!

    // 下面的两个枚举是等价的
    enum WeekDay
    {
        Sunday,
        Monday,
    };
    
    enum WeekDay_2  // 枚举名的定义规则也同变量的命名规则
    {
        Sunday,
        Monday      // 逗号可以省略
    };
    4. 枚举的值,相当于整数,可正可负,而且可以指定从起始值,后一个值比前一个大 1 #

    请回头看一下我们的例程,注意最后的分号!

    enum level
    {
        low,          // 枚举值等于 0【默认值】
        middle,       // 枚举值等于 1
        high          // 枚举值等于 2
    };
    
    enum WeekDay
    {
        Sunday = 5,   // 枚举值等于 5
        Monday,       // 枚举值等于 6
    };
    
    enum color
    {
        RED = -10,   // 枚举值等于 -10
        BLUE,        // 枚举值等于 -9
        YELLOW = 88, // 【注意】枚举值等于 88
        BLACK        // 【注意】枚举值等于 89
    };
    5. 枚举的值,可以当作整数输出 #

    请看示例程序:

    #include < iostream >
    using namespace std;
    
    enum WeekDay
    {
        Sunday,
        Monday,
        Tuesday, 
        Wednesday, 
        Thursday, 
        Friday, 
        Saturday
    };
    
    int main()
    {
        // 直接输出
        cout << WeekDay::Sunday << endl;
    
        // 输出变量
        WeekDay wd = WeekDay::Sunday;
        cout << wd << endl;
    
        // 输出变量
        wd = 2;               // 相当于 WeekDay::Tuesday
        cout << wd << endl;
        
        return 0;
    }

    3. switch 的使用 #

    有一些场景,枚举经常和 switch 一起使用

    #include < iostream >
    using namespace std;
    
    enum WeekDay
    {
        Sunday,
        Monday,
        Tuesday, 
        Wednesday, 
        Thursday, 
        Friday, 
        Saturday
    };
    
    int main()
    {
        WeekDay dashima(WeekDay::Sunday);   // 初始化
        
        switch (dashima)                    // swith 小括号中可以是整型变量,枚举也可看作整型
        {
            case WeekDay::Sunday:    cout << "Sunday";     break;
            case WeekDay::Monday:    cout << "Monday";     break;
            case WeekDay::Tuesday:   cout << "Tuesday";    break;
            case WeekDay::Wednesday: cout << "Wednesday";  break;
            case WeekDay::Thursday:  cout << "Thursday";   break;
            case WeekDay::Friday:    cout << "Friday";     break;
            case WeekDay::Saturday:  cout << "Saturday";   break;
        }
        return 0;
    }

    小练习:巧变颜色

    在命令行中,我们可以使用 windows 的一些函数来使窗口变色。
    
    请包含头文件 
    #include < windows.h >
    
    system("color 0f");  // 黑色(BLK),默认
    system("color 1f");  // 蓝色(BLU)
    system("color 2f");  // 绿色(GRE)
    system("color 3f");  // 青色(CYA)
    system("color 4f");  // 红色(RED)
    
    请编程,实现窗口的颜色切换。请设计一个枚举类型,然后输入一个数字,执行相应的颜色切换。
    要求黑色的枚举值为 -1 ,绿色的枚举值为 10
    【输入】
    一行,整数。
    
    /*
    请完成后,查看示例程序
    
    
    
    
    */

    示例程序:

    #include < iostream >
    using namespace std;
    
    enum color
    {
        BLK,
        BLU,
        GRE, 
        CYA, 
        RED, 
    };
    
    int main()
    {
    	int val(0);
    	cin >> val;
    	color col = (color)val;  // 强制类型转化
        
        switch (dashima)             // swith 小括号中可以是整型变量,枚举也可看作整型
        {
            case color::BLK : system("color 0f"); break;
            case color::BLU : system("color 1f"); break; 
            case color::GRE : system("color 2f"); break; 
            case color::CYA : system("color 3f"); break; 
            case color::RED : system("color 4f"); break; 
        }
        return 0;
    }

    习题 #

    课后练习