C++:enum枚举&共用体union

发布于:2024-06-29 ⋅ 阅读:(14) ⋅ 点赞:(0)

enum枚举

C++继承C的枚举用法
(1)典型枚举类型定义,枚举变量定义和使用
(2)枚举类型中的枚举值常量不能和其他外部常量名称冲突:
举例1宏定义,举例2另一个枚举

   // 定义一个名为Color的枚举类型
enum Color {
    RED,    // 红色,默认值为0
    GREEN,  // 绿色,默认值为1
    BLUE    // 蓝色,默认值为2
};
    // 声明一个枚举变量并赋值
    Color myColor = RED;

    // 使用switch语句来处理不同的枚举值
    switch (myColor) {
        case RED:
            cout << "The color is red." << endl;
            break;
        case GREEN:
            cout << "The color is green." << endl;
            break;
        case BLUE:
            cout << "The color is blue." << endl;
            break;
        default:
            cout << "Unknown color." << endl;
            break;
    }

    // 输出枚举的整数值
    cout << "The integer value of RED is: " << RED << endl;
    cout << "The integer value of GREEN is: " << GREEN << endl;
    cout << "The integer value of BLUE is: " << BLUE << endl;

C++11中扩展的枚举
(1)enum class enumType:valueType{one=xx, two, three};
(2)两种简写
(3)解决2个枚举中的重名问题,但是宏定义仍然不能重名

强类型枚举(Scoped Enumerations)
强类型枚举使用enum class关键字定义,它们是强类型的,不能隐式转换为整数,并且枚举成员必须使用枚举类型名进行限定。
简化写法1:

// 定义一个强类型枚举Color
enum class Color {
    RED,
    GREEN,
    BLUE
};

简化写法2:

enum Color {
    RED,
    GREEN,
    BLUE
};

完全写法:

// 定义一个基于整型的枚举Color
enum class Color1 : uint8_t {
    RED,
    GREEN,
    BLUE
};

int test() {
    // 声明一个基于整型的枚举变量并赋值
    Color1 myColor1 = Color1::RED;

    // 使用switch语句来处理不同的枚举值
    switch (myColor1) {
        case Color1::RED:
            cout << "The Color1 is red." << endl;
            break;
        case Color1::GREEN:
            cout << "The Color1 is green." << endl;
            break;
        case Color1::BLUE:
            cout << "The Color1 is blue." << endl;
            break;
        default:
            cout << "Unknown Color1." << endl;
            break;
    }

    // 强类型枚举不能直接转换为整数,需要显式转换
    cout << "The integer value of Color1::RED is: " << static_cast<int>(Color1::RED) << endl;
    cout << "The integer value of Color1::GREEN is: " << static_cast<int>(Color1::GREEN) << endl;
    cout << "The integer value of Color1::BLUE is: " << static_cast<int>(Color1::BLUE) << endl;

    return 0;
}

static_cast 是 C++ 中的一种类型转换操作符,用于将一个表达式的值从一种类型强制转换为另一种类型。在这种情况下,它通常用于将某个对象或表达式从一个基类转换为它的派生类,或者是将一个非特定类型的值转换为整型(int)。static_cast 保证了转换的准确性和效率,因为它不需要运行时的动态检查,而是在编译时完成。

关于枚举的3个小细节
(1)枚举类型和值类型的互相转换,枚举类型是否可以++
(2)枚举类型的前置声明
(3)枚举类型超出范围访问是否会编译时或运行时报错

/ 前置声明
enum class Color1 ; // 声明 Color1 类型,但不提供具体定义

共用体union

C语言中union回顾
(1)union翻译成共用体更合适,而不是联合、联合体
(2)union中所有成员是多选一的关系,这是union和struct的最大差别
(3)union的典型用法是测试大小端,面试笔试常考,必须掌握

C++中union和C中不同
(1)C++中union类型定义后使用时可以省去union(和上节enum时一样)
(2)C++中union里成员除了普通的,还可以是对象,但是对象不能包含自定义构造函数、析构函数,简单说就是不能太复杂
(3)C++中经常用到匿名union,一般是内置在class内部做成员变量
匿名union:

union 
{
	char *p1;
	int *p2;
}m1;				// 直接定义了union变量m1
#include <iostream>
using namespace std;

// 定义一个联合类型
union Data {
    int i;
    float f;
    char str[20];
};

int main() {
    // 声明一个变量
    Data data;

    // 存储整数
    data.i = 10;
    cout << "data.i = " << data.i << endl;

    // 存储浮点数
    data.f = 220.5;
    cout << "data.f = " << data.f << endl;

    // 存储字符串
    strcpy(data.str, "Hello, World!");
    cout << "data.str = " << data.str << endl;

    // 注意,由于union的所有成员共享同一块内存,
    // 存储一个成员的值会覆盖之前存储的其他成员的值
    cout << "After storing str, data.i = " << data.i << endl;
    cout << "After storing str, data.f = " << data.f << endl;

    return 0;
}

在这里插入图片描述

总结

知道枚举的使用方法,强类型枚举(Scoped Enumerations)
知道共用体union的使用方法

学习记录,侵权联系删除。
来源:朱老师物联网大课堂


网站公告

今日签到

点亮在社区的每一天
去签到