关于C++枚举的相关问题

问题来源:C++ Primier Plus第六版,606页,书中用类名调用了枚举变量,然后就在想,为啥可以用类名去调用呢?类名不是只能调用static类型的东西吗?于是乎,各种百度大佬的文章,书中并没有明确得交代。

话不多说,码来!

#include<iostream>
using namespace std;

class A
{
public:
	int a,b;
	enum {one, two,three} nu;
};

int main()
{
	cout << A::two<<endl;
	A a;
	cout << sizeof(a);
	system("pause");
	return 0;
}
输出结果
1
12

代码说明:这里通过类名去输出符号常量two的值,然后sizeof(a)的值是12,这是要因为里面有两个int型变量,这里是8,然后因为我们在类中创建了枚举类型的变量nu,由于枚举也算是一种Int,所以这里加起来就是12了

然后如果我们这里不在类中定义nu,则sizeof就是8

书中交代了,如果打算只使用常量,而不创建枚举类型的变量,则可以省略枚举类型的名称

然后为什么可以通过类名进行调用呢?这是因为该枚举是一个常量,在编译的时候已经被放入了常量区。调用的时候因此不需要该枚举的变量也可以调用

参考博客https://www.cnblogs.com/chengkeke/p/5417368.html

 

代码段二:作用域内枚举

在传统枚举中,如果两个枚举定义中的枚举量是一样的,那么就会发生冲突,比如下面这段代码

#include<iostream>
#include<string>
#include"Tv.h"
using namespace std;

class A
{
public:
	int a,b;
	enum nu {one, two,three} ;
    enum nuu {one, two, three}; 
	//enum class nuu {one, two, three}; 
};

int main()
{
	//cout << A::two<<int(A::nuu::one)<<endl;
	system("pause");
	return 0;
}

由于在nu和nuu中的符号常量是一致的,所以在编译时会报错说,重定义

为了解决这个问题c++11中引入了作用域内枚举,也就是我在public中注释的那一行,正确形式应该是

C++11中提高了作用于内枚举的类型安全,作用域内枚举将不能隐式转换为整形

#include<iostream>
#include<string>
#include"Tv.h"
using namespace std;

class A
{
public:
	int a,b;
	enum nu {one, two,three} ;
    //enum nuu {one, two, three}; 
	enum class nuu {one, two, three}; 
};

int main()
{
	cout << A::two<<int(A::nuu::one)<<endl;
    int a = A::two; //正确
    int b = A::nuu::two; //错误
    int c = int(A::nuu::two);
	system("pause");
	return 0;
}

这段代码说明的问题就是,普通的枚举类型会自动转换为整形,但是作用域内枚举不能饮食的转换为整形,需要进行显示的类型转换


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巴塞罗那的风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值