C++自学笔记10(枚举关键字enum)

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中结构体内部变量为静态时,需要重新定义用到“::”

最后再来说以下,类包含数据和方法,结构体只存放变量,枚举存放数值,结尾花括号后都有“;”具体细节看笔记吧。

  • 12
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值