int A = 0;
int B = 1;
int C = 2;
int main()
{
int i = B;
if(i == B)
std::cout<<"hello"<<std::endl;
std::cin.get();
}
上述代码ABC代表012,i=1时打印hello。我们从这个文件能看到一个问题。变量没有分组很容易被打乱。
int A = 0;
int B = 1;
char string = “hello”;
int C = 2;
int main()
{
int i = B;
if(i == B)
std::cout<<"hello"<<std::endl;
std::cin.get();
}
我们知道i是int类型,所以char 类型的string完全就是异类插入一脚,所以我们引进enum枚举将ABC化为一组。
enum Level
{
A,B,C
};
int main()
{
int i = B;
if(i == B)
std::cout<<"hello"<<std::endl;
std::cin.get();
}
在这里我们就像相当于对ABC进行分组并且放置在Level中,其中A默认第一个为0,紧挨着的变量按顺序加1。ABC分别是012.
我们改写
enum Level
{
A=1,B,C
};
enum Level
{
A,B=10,C
};
第一种ABC分别为123
第二种ABC分别为0、10、11
难道只可以对int类型分组吗?当然不是
enum Level:char
{
A,B,C
};
int main()
{
int i = B;
if(i == B)
std::cout<<"hello"<<std::endl;
std::cin.get();
}
在这个位置写下你想要的类型即可改变ABC为char类型,这样改变就从默认的4字节改成了1字节节省了内存。
还记得在笔记8中我们编写的Log类
class Log
{
public:
const int LogLevelError = 0;
const int LogLevelWarning = 1;
const int LogLevelInfo = 2;
private:
int m_LogLevel = LogLevelInfo;
public:
void SetLevel(int level)
{
m_LogLeve = level;
}
void Error(const char* message)
{
if(m_LogLeve=LogLevelError)
std::cout<<"[ERROR]"<<message<<std::endl;
}
void Warn(const char* message)
{
if(m_LogLeve=LogLevelWarning)
std::cout<<"[WARNING]"<<message<<std::endl;
}
void Info(const char* message)
{
if(m_LogLeve=LogLevelInfo)
std::cout<<"[INFORMATION]"<<message<<std::endl;
}
};
int main()
{
Log log;
log.SetLevel(log.LogLevelWarning);
log.Warn("hello,it is warning");
std::cin.get();
}
对于消息的等级我们分别写了LogLevelError、LogLevelWarning、LogLevelInfo对应012的级别。
我们就可以用enum优化改写。
class Log
{
public:
enum LogLevel
{
LogLevelError ,LogLevelWarning ,LogLevelInfo
};
private:
int m_LogLevel = LogLevelInfo;
public:
void SetLevel(int level)
{
m_LogLeve = level;
}
void Error(const char* message)
{
if(m_LogLeve=LogLevelError)
std::cout<<"[ERROR]"<<message<<std::endl;
}
void Warn(const char* message)
{
if(m_LogLeve=LogLevelWarning)
std::cout<<"[WARNING]"<<message<<std::endl;
}
void Info(const char* message)
{
if(m_LogLeve=LogLevelInfo)
std::cout<<"[INFORMATION]"<<message<<std::endl;
}
};
int main()
{
Log log;
log.SetLevel(Level::LogLevelWarning);
log.Warn("hello,it is warning");
std::cin.get();
}
将三个等级放到Level中,我们看到main里SetLevel括号中从Log.LongLevelWarning变成了Level::LongLevelWarning.这是因为Level不是命名空间他是一个枚举类,所以引用要用“::”.上一个使用“::”符号是在笔记9中结构体内部变量为静态时,需要重新定义用到“::”
最后再来说以下,类包含数据和方法,结构体只存放变量,枚举存放数值,结尾花括号后都有“;”具体细节看笔记吧。