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. 枚举定义及枚举数值类型指定
- 枚举是用来限定确切范围的,属性的值是整型数值,默认从0开始,也可以自定义值,未被定义的依照前一个值+1赋值。
- 枚举的默认类型是32位整数,我们没有必要使用32位的值,可以使用8位整数:unsigned char, 占用更少空间。也可以是:int 、short、long,但不可以是float 或double,必须是整数类型。
- 如果是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();
}

浙公网安备 33010602011771号