问题来源: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;
}
这段代码说明的问题就是,普通的枚举类型会自动转换为整形,但是作用域内枚举不能饮食的转换为整形,需要进行显示的类型转换