C++学习笔记 03 枚举

一、java枚举

import org.junit.Test;

enum EnumA {
    A, B, C;
}

public class TestEnum {
    @Test
    public void testEnum() {
        System.out.println(EnumA.A); //A
        System.out.println(EnumA.B); //B
        System.out.println(EnumA.C); //C

        System.out.println(EnumA.A.ordinal());  //0
        System.out.println(EnumA.B.ordinal());  //1
        System.out.println(EnumA.C.ordinal());  //2

        System.out.println("A".equals(EnumA.A.toString())); //true
        System.out.println("B".equals(EnumA.B.toString())); //true
        System.out.println("C".equals(EnumA.C.toString())); //true

        System.out.println("A".equals(EnumA.A)); //false
        System.out.println("B".equals(EnumA.B)); //false
        System.out.println("C".equals(EnumA.C)); //false
    }
}

二、C++枚举

1. 枚举定义及枚举数值类型指定

  1. 枚举是用来限定确切范围的,属性的值是整型数值,默认从0开始,也可以自定义值,未被定义的依照前一个值+1赋值。
  2. 枚举的默认类型是32位整数,我们没有必要使用32位的值,可以使用8位整数:unsigned char, 占用更少空间。也可以是:int 、short、long,但不可以是float 或double,必须是整数类型。
  3. 如果是int 、short、long,打印可以直接打印出数值。若是char类型 也是数值从0开始的char, ,不能直接打印出数值,需要用(int)强转。
#include<iostream>
//默认从0开始
//可以自定义值,未被定义的依照前一个值+1赋值

//枚举的默认类型是32位整数,我们没有必要使用32位的值,可以使用8位整数:unsigned char,占用更少空间
// 不可以是float 或double,必须是整数类型

//enum MyEnum : int
//enum MyEnum : unsigned int
//enum MyEnum : unsigned long
//enum MyEnum : unsigned short
//enum MyEnum :  float  X
 enum MyEnum : char
//enum MyEnum
{
	A = 1, B, C
};


int main() {
	MyEnum e;
	std::cout << (int)MyEnum::A << std::endl;	//0
	std::cout << (int)MyEnum::B << std::endl;	//1
	std::cout << (int)MyEnum::C << std::endl;	//2

	int i = 2;

	switch (i) {
		case MyEnum::A:
			std::cout << "Hello" << std::endl;	//0
			break;
		case MyEnum::B:
			std::cout << "World" << std::endl;	//0
			break;
		case MyEnum::C:
			std::cout << "Hello World" << std::endl; //0
			break;
	}

	std::cin.get();
}

2. 类内部枚举的定义及名称规避

类内部枚举属性可以被类直接引用,所以,类内部枚举的属性值不可以和类本身的属性或方法名重复,否则无法识别

#include<iostream>

class Log {
public:
	enum Level {
		LevelError, LevelWarn, LevelInfo
	};
private:
	int m_LogLevel = Level::LevelInfo;
public:
	void SetLevel(Level level) {
		m_LogLevel = level;
	}
	void Error(const char* message) {
		if (m_LogLevel >= 0)
			std::cout << "[ERROR]:" << message << std::endl;
	}
	void Warn(const char* message) {
		if (m_LogLevel >= 1)
			std::cout << "[WARNING]:" << message << std::endl;
	}
	void Info(const char* message) {
		if (m_LogLevel >= 2)
			std::cout << "[INFO]:" << message << std::endl;
	}

};


int main() {
	Log log;
	//类内部枚举属性可以被类直接引用,所以,类内部枚举的属性值不可以和类本身的属性或方法名重复,否则无法识别
	log.SetLevel(Log::LevelWarn);
	log.SetLevel(Log::Level::LevelWarn);
	log.Warn("Hello World");
	log.Error("Hello World");
	log.Info("Hello World");

	std::cin.get();
}
posted @ 2025-12-11 09:12  超轶绝尘  阅读(12)  评论(0)    收藏  举报